ビルド自体はできるのですがシミュレータ内で検索をすると<<<<>>>>の部分でタイトルのエラーが出てうまく動いてくれません。どこかでnilが悪さしてる事はわかるのですが解決法がわからないのでわかるかたがいらっしゃいましたらぜひ教えていただけたらと思います。
swift5!
1// 2// ViewController.swift 3// MyOkashi 4// 5// Created by aaaaa on 2020/06/24. 6// Copyright © 2020 aaaaa. All rights reserved. 7// 8 9import UIKit 10 11class ViewController: UIViewController, UISearchBarDelegate, UITableViewDataSource { 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 // Do any additional setup after loading the view. 16 17 //Search Bar のdelegate通知先を設定 18 searchText.delegate = self 19 //入力のヒントとなる、プレースホルダーを設定 20 searchText.placeholder = "お菓子の名前を入力してください" 21 //TableViewのdataSourceを設定 22 tableView.dataSource = self 23 24 } 25 26 27 @IBOutlet weak var searchText: UISearchBar! 28 29 @IBOutlet weak var tableView: UITableView! 30 31 //お菓子のリスト(タプル配列) 32 var okashiList : [(name:String , maker:String , link:URL , image:URL)] = [] 33 34 35 //検索ボタンをクリック時 36 func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 37 //キーボードを閉じる 38 view.endEditing(true) 39 40 if let searchWord = searchBar.text { 41 //デバックエリアに出力 42 print(searchWord) 43 //入力されていたらお菓子を検索 44 searchOkashi(keyword: searchWord) 45 } 46 } 47 //JSONのitem内のデータ構造 48 struct ItemJson : Codable { 49 //お菓子の名称 50 let name: String? 51 //メーカー 52 let maker : String? 53 //掲載URL 54 let url : URL? 55 //画像URL 56 let image : URL? 57 58 } 59 60 //JSONのデータ構造 61 struct ResultJson : Codable { 62 //複数要素 63 let item :[ItemJson]? 64 } 65 //searchOkashiメソッド 66 //第一引数 : keyword 検索したいワード 67 func searchOkashi(keyword : String){ 68 //お菓子の検索キーワードをURLエンコードする 69 guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { 70 return 71 } 72 73 74 // リクエストURLの組み立て 75 guard let req_url = URL(string: "https://sysbird.jp/toriko/api/?apikey=guest&format=json&keyword=(keyword_encode)&max=10&order=r") else { 76 return 77 } 78 print(req_url) 79 80 //リクエストに必要な情報を生成 81 let req = URLRequest(url: req_url) 82 //データ転送を管理するためのセッションを生成 83 let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main) 84 //リクエストをタスクとして登録 85 let task = session.dataTask(with: req, completionHandler: { 86 (data , response , error) in 87 //セッションを終了 88 session.finishTasksAndInvalidate() 89 // do try catch エラーハンドリング 90 do { 91 //JSONDecoderのインスタンス取得 92 let decoder = JSONDecoder() 93 //受け取ったJSONデータをパース(解析)して格納 94 <<<<<<let json = try decoder.decode(ResultJson.self,from:data!)>>>>>> 95 96 //お菓子の情報が取得できているか確認 97 if let items = json.item { 98 //お菓子のリストを初期化 99 self.okashiList.removeAll() 100 //取得しているお菓子の数だけ処理 101 for item in items { 102 //お菓子の名称、メーカー名、掲載URL, 画像URLをアンラップ 103 if let name = item.name , let maker = item.maker , let link = item.url , let image = item.image{ 104 //一つのお菓子をタプルでまとめて管理 105 let okashi = (name,maker,link,image) 106 //お菓子の配列へ追加 107 self.okashiList.append(okashi) 108 } 109 } 110 if let okashidbg = self.okashiList.first{ 111 print("----------------") 112 print("okashiList[0] = (okashidbg)") 113 } 114 } 115 } catch { 116 //エラー処理 117 print("エラーが出ました") 118 } 119 120 }) 121 //ダウンロードの開始 122 task.resume() 123 124 } 125 //cellの総数を返すdatasourceメソッド必ず記述する必要があります 126 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 127 //お菓子リストの総数 128 return okashiList.count 129 } 130 //cell に値を設定するdatasourceメソッド。必ず記述する必要があります。 131 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 132 //今回表示を行うCellオブジェクト(1行)を取得する 133 let cell = tableView.dequeueReusableCell(withIdentifier: "okashicell", for: indexPath) 134 //お菓子のタイトル設定 135 cell.textLabel?.text = okashiList[indexPath.row].name 136 //お菓子画像を取得 137 if let imageData = try? Data(contentsOf: okashiList[indexPath.row].image){ 138 //正常に取得できた場合には、UIimageで画像オブジェクトを生成してcellにお菓子画像を設定。 139 cell.imageView?.image = UIImage(data:imageData) 140 } 141 //設定ずみのCellオブジェクトを画面に反映。 142 return cell 143 } 144} 145 146
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/30 07:47