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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

1回答

377閲覧

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

diamons

総合スコア7

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/06/30 06:54

編集2020/06/30 06:56

ビルド自体はできるのですがシミュレータ内で検索をすると<<<<>>>>の部分でタイトルのエラーが出てうまく動いてくれません。どこかで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

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

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

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

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

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

guest

回答1

0

ベストアンサー

「たった2日でマスターできる iPhone アプリ開発集中講座」のコードだという前提で回答いたします。

実行時、デバッグエリアに

2020-06-30 16:22:45.851675+0900 274033_MyOkashi[45374:5927598] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

から始まる一連のエラーメッセージが出ていると思います。このメッセージにも書かれている通り、HTTP通信を行う場合には、Info.plistという名前のファイルで設定を行う必要があります。

書籍だと397ページあたりに記述されていますが、「ATSの設定を変更」というところの処理まで行ったあと実行しなければ実行時エラーとなります。

ちなみに、書籍のコードだとエラー処理が行われていないため実行時エラーとなっていますが、きちんとエラー処理を行えば実行時エラーで落ちることはないかと思います(これは書籍の問題ですが)。

投稿2020/06/30 07:28

TsukubaDepot

総合スコア5086

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

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

diamons

2020/06/30 07:47

まさにその本です! ATSの設定変更してもエラーが治らなかったのですがいちど追加した設定を消してやり直したらできました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問