RxSwiftでAPIクライアントを作っているのですが、
Unexpectedly found nil while unwrapping an Optional value
となってしまいます。
まずモデルとデコードです。
// OkashiPage.swift struct OkashiSearchResponse: Decodable { let item: [OkashiPage] } struct OkashiPage { let name: String let maker: String let url: URL } extension OkashiPage: Decodable { private enum CodingKeys: String, CodingKey { case name case maker } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.name = try container.decode(String.self, forKey: .name) print("Name: (self.name)") self.maker = try container.decode(String.self, forKey: .maker) self.url = URL(string: "https://www.sysbird.jp/webapi/?apikey=guest&format=json&keyword=(name)")! } }
検索APIです。
// OkashiAPI.swift protocol OkashiAPI { func search(from word: String) -> Observable<[OkashiPage]> } class OkashiDefaultAPI: OkashiAPI { private let host = URL(string: "https://sysbird.jp")! private let path = "/toriko/api/" private let URLSession: Foundation.URLSession init(URLSession: Foundation.URLSession){ self.URLSession = URLSession } func search(from word: String) -> Observable<[OkashiPage]> { var components = URLComponents(url: host, resolvingAgainstBaseURL: false)! components.path = path let items = [ URLQueryItem(name: "apikey", value: "guest"), URLQueryItem(name: "keyword", value: word), URLQueryItem(name: "format", value: "json"), URLQueryItem(name: "max", value: "10") ] components.queryItems = items let request = URLRequest(url: components.url!) return URLSession.rx.response(request: request) .map { pair in do { let response = try JSONDecoder().decode(OkashiSearchResponse.self, from: pair.data) return response.item } catch { throw error } } } }
そしてViewModelとViewControllerです。
class OkashiSearchViewModel { let okashiPages: Observable<[OkashiPage]> init(searchWord: Observable<String>, okashiAPI: OkashiAPI){ okashiPages = searchWord .filter { 3 <= $0.count } .flatMapLatest { return okashiAPI.search(from: $0) .catchErrorJustReturn([]) } .share(replay: 1) } } class ViewController: UIViewController, UISearchBarDelegate { @IBOutlet weak var searchBar: UISearchBar! @IBOutlet weak var tableView: UITableView! private let disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() searchBar.delegate = self searchBar.placeholder = "お菓子の名前を入力してください" let viewModel = OkashiSearchViewModel(searchWord: searchBar.rx.text.orEmpty.asObservable(), okashiAPI: OkashiDefaultAPI(URLSession: .shared)) viewModel.okashiPages .bind(to: tableView.rx.items(cellIdentifier: "Cell")) { index, result, cell in cell.textLabel?.text = result.name } .disposed(by: disposeBag) } }
問題が生じるのはextension OkashiPageの
self.url = URL(string: "https://www.sysbird.jp/webapi/?apikey=guest&format=json&keyword=(name)")!
です。
](711dd6e289423bf3cd4ef898c9a26903.jpeg)
英語だと大丈夫なのですが、数字や日本語だとエラーが出てしまいます。
url はオプショナルで、後ろで強制アンラップしているはずなのに出てしまいます。
原因はnameだと分かっているのですが、どうしたらいいのか分かりません。
どなたか解決方法を教えていただけると恐縮です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/08 04:17
2021/01/08 04:48
2021/01/08 05:06
2021/01/08 05:16