質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

449閲覧

## error: keyNotFound のエラー先が見つけられない

KaiTomoda

総合スコア10

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/02/24 05:28

前提・実現したいこと

約1ヶ月前からswiftを勉強しており、参考書を片手にWEBAPI連携をした
商品検索アプリを試作しております。
コードのエラーは無くなったのですが、実行し検索をするも検索結果が得られないといった表示がされますので
ご教授いただきたくご連絡いたしました。

発生している問題・エラーメッセージ

error: keyNotFound(CodingKeys(stringValue: "name", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "ResultSet", intValue: nil), CodingKeys(stringValue: "0", intValue: nil), CodingKeys(stringValue: "Result", intValue: nil), CodingKeys(stringValue: "0", intValue: nil)], debugDescription: "No value associated with key CodingKeys(stringValue: "name", intValue: nil) ("name").", underlyingError: nil))

該当のソースコード

複数ファイルがあるもこのファイルかと思います。
//
// SearchItemTableViewController.swift
// MySearchApp
//
// Created by 友田開 on 2019/02/23.
// Copyright © 2019 tomoda-kai530. All rights reserved.
//

import UIKit

class SearchItemTableViewController: UITableViewController,
UISearchBarDelegate {

var itemDataArray = [ItemData]() var imageCache = NSCache<AnyObject, UIImage>() //APIを利用するためのクライアントID let appid = "dj00aiZpPW5GVzdjZjkyT1dtZSZzPWNvbnN1bWVyc2VjcmV0Jng9MDg-" let entryUrl: String = "https://shopping.yahooapis.jp/ShoppingWebService/V1/json/itemSearch" //数字を金額の形式に整形するためのフォーマッター let priceFormat = NumberFormatter() override func viewDidLoad() { super.viewDidLoad() //価格のフォーマット指定 priceFormat.numberStyle = .currency priceFormat.currencyCode = "JPY" } //キーボードのsearchボタンがタップされたときに呼び出される func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { //入力された文字の取り出し guard let inputText = searchBar.text else { //入力文字なし return } //入力文字数が0文字より多いかどうかチェックする guard inputText.lengthOfBytes(using: String.Encoding.utf8) > 0 else { //0文字より多くはなかった return } //保持している商品をいったん削除 itemDataArray.removeAll() //パラメータを指定する let parameter = ["appid": appid, "query": inputText] //パラメータをエンコードしたURLを作成する let requestUrl = creatRequestUrl(parameter: parameter) //APIをリクエストする request(requestUrl: requestUrl) //キーボードを閉じる searchBar.resignFirstResponder() } //パラメータのURLエンコード処理 func encodeParameter(key: String, value: String) -> String? { //値をエンコードする guard let escapedValue = value.addingPercentEncoding( withAllowedCharacters: CharacterSet.urlQueryAllowed) else { //エンコード失敗 return nil } //エンコードした値をkey=valueの形式で返却する return "(key)=(escapedValue)" } //URL作成処理 func creatRequestUrl(parameter: [String: String]) -> String { var parameterString = "" for key in parameter.keys { //値の取り出し guard let value = parameter[key] else { //値なし。次のfor文の処理を行う continue } //すでにパラメータが設定されていた場合 if parameterString.lengthOfBytes(using: String.Encoding.utf8) > 0 { //パラメータ同士のセパレータである&を追加する parameterString += "&" } //値をエンコードする guard let encodeValue = encodeParameter(key: key, value: value) else { //エンコード失敗。次のfor文の処理を行う continue } //エンコードした値をパラメータとして追加する parameterString += encodeValue } let requestUrl = entryUrl + "?" + parameterString return requestUrl } //リクエストを行う func request(requestUrl: String) { //URL生成 guard let url = URL(string: requestUrl) else { //URL生成失敗 return } //リクエスト生成 let request = URLRequest(url: url) //商品検索APIをコールして商品検索を行う let session = URLSession.shared let task = session.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in //通信完了後の処理 //エラーチェック guard error == nil else { //エラー表示 let alert = UIAlertController(title: "エラー", message: error?.localizedDescription, preferredStyle: UIAlertController.Style.alert) //UIに関する処理はメインスレッド上で行う DispatchQueue.main.async { self.present(alert, animated: true, completion: nil) } return } //JSONで返却されたデータをパースして格納する guard let data = data else { //データなし return } do { //パース実施 let resultSet = try JSONDecoder().decode(ItemSearchResultSet.self, from: data) //商品のリストに追加 self.itemDataArray.append(contentsOf: resultSet.resultSet.firstObject.result.items) } catch let error { print("## error: (error)") } //テーブルの描画処理を実施 DispatchQueue.main.async { self.tableView.reloadData() } } //通信開始 task.resume() } //Mark: -Table view data source //テーブルのセクション数を取得 override func numberOfSections(in tableView: UITableView) -> Int { // #warning Incomplete implementation, return the number of sections return 1 } //セクション内の商品数を取得 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return itemDataArray.count } //MARK: - Table view data source //テーブルセルの取得処理 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell", for: indexPath) as? ItemTableViewCell else { return UITableViewCell() } let itemData = itemDataArray[indexPath.row] //商品のタイトル設定 cell.itemTitleLabel.text = itemData.name //商品価格設定処理(日本通過の形式で設定する) let number = NSNumber(integerLiteral: Int(itemData.priceInfo.price!)!) cell.itemPriceLabel.text = priceFormat.string(from: number) //商品のURL設定 cell.itemUrl = itemData.url //画像の設定処理 //すでにセルに設定されている画像と同じかどうかてチェックする //画像がまだ設定されていない場合に処理を行う guard let itemImageUrl = itemData.imageInfo.medium else { //画像なし商品 return cell } //キャッシュの画像を取り出す if let cacheImage = imageCache.object(forKey: itemImageUrl as AnyObject) { //キャッシュ画像の設定 cell.itemImageView.image = cacheImage return cell } //キャッシュの画像がないためダウンロードする guard let url = URL(string: itemImageUrl) else { //urlが生成できなかった return cell } let request = URLRequest(url: url) let session = URLSession.shared let task = session.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in guard error == nil else { //エラーあり return } guard let data = data else { //データが存在しない return } guard let image = UIImage(data: data) else { //imageが生成出来なかった return } //ダウンロードしたが画像をキャッシュに登録しておく self.imageCache.setObject(image, forKey: itemImageUrl as AnyObject) //画像はメインスレッド上で設定する DispatchQueue.main.async { cell.itemImageView.image = image } } //画像の読み込み処理開始 task.resume() return cell } //商品をタップして次の画面に遷移する前の処理 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let cell = sender as? ItemTableViewCell { if let webViewController = segue.destination as? WebViewController { //商品ページのURLを設定する webViewController.itemUrl = cell.itemUrl } } }

}

試したこと

コードエラーの確認
API接続テストの実施

補足情報(FW/ツールのバージョンなど)

ご協力お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問