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

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

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

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

Swift

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

Q&A

解決済

2回答

1698閲覧

xcodeのエラーについて:変数型の定義

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

0グッド

0クリップ

投稿2016/10/19 05:07

編集2016/10/19 07:59

xcodeでswift3を勉強している初心者です。
郵便番号を入力するとそれをAPIに投げて住所を取得するアプリを、サンプルコードを用いて練習しています。下記のコードを書いて実行すると、郵便番号をテキストフィールドに入力してボタンをタップした時点でエラーになります。コード中盤の太字斜体部分の
///////////////////////////////////////////////////////////
let jsonDic = try JSONSerialization.jsonObject(
with: data!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSDictionary
///////////////////////////////////////////////////////////
でエラーが出ており、それが型の定義に関するエラーだということはわかりました(fatal error: unexpectedly found nil while unwrapping an Optional value)が、どこが問題なのかが分からず困っています。
基礎の部分だと思いますが、調べてもよく分からず質問させていただいた次第です。
どなたか教えていただければ幸いです、よろしくお願いします。

*記述コード*

import UIKit class ViewController: UIViewController { @IBOutlet weak var zipTextField: UITextField! @IBOutlet weak var addressLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } @IBOutlet weak var prefLabel: UILabel! override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBOutlet weak var tapReturn: UITextField! @IBAction func tapSearch() { guard let ziptext = zipTextField.text else { // 値がnilだったら、終了します return } //////////////////////////////////////////////////////////////////////////////////// // リクエストするURLを作ります let urlStr = "http://api.zipaddress.net/?zipcode=\(ziptext)" if let url = URL(string: urlStr) { // urlオブジェクトがnilでなかったら、検索処理オブジェクトを作ります let urlSession = URLSession.shared //「 検索処理が完了したら、onGetAddressを呼び出す」というタスクを作ります let task = urlSession.dataTask(with: URLRequest(url:url)) { data, response, error in do { // dataをJSON解析を実行します **__ let jsonDic = try JSONSerialization.jsonObject( with: data!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSDictionary__** //print("検査\(jsonDic)") // 解析できた値を調べていきます if let code = jsonDic["code"] as? Int { // codeという項目が整数なら、住所検索APIからのコード情報です if code != 200 { // コードが200でないときは、検索エラーです if let errmsg = jsonDic["message"] as? String { // エラーメッセージを表示します DispatchQueue.main.async { self.prefLabel.text = errmsg } } } } if let data = jsonDic["data"] as? NSDictionary { // dataという項目が辞書データなら、その中身を調べます if let pref = data["pref"] as? String { // data内のprefという項目が文字列なら、県名です DispatchQueue.main.async { self.prefLabel.text = pref } } if let address = data["address"] as? String { // data内のaddressという項目が文字列なら、住所です DispatchQueue.main.async { self.addressLabel.text = address } } } } catch { // JSON解析に失敗したときに実行します DispatchQueue.main.async { self.addressLabel.text = "エラーです" } } } // タスクを実行します task.resume() } } } ````````````````````````````````````````````````````![イメージ説明](a7242dba41154bd642e568d107599560.png)

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

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

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

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

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

fuzzball

2016/10/19 05:18

行頭のtab/spaceが潰れてしまいますので、コードは ``` で囲って下さい。
退会済みユーザー

退会済みユーザー

2016/10/19 08:00

ご指摘ありがとうございました!
guest

回答2

0

dataを扱う前にエラーチェックをして下さい。

swift

1let task = urlSession.dataTask(with: URLRequest(url:url)) { 2 data, response, error in 3 if error != nil { 4 //エラー処理 5 } else { 6 //取得後の処理 7 } 8}

投稿2016/10/19 05:39

fuzzball

総合スコア16731

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

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

0

ベストアンサー

そのエラーの前に、

2016-10-19 14:25:28.666810 Test[5114:1806216] 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.

みたいなメッセージ出てませんか? apiの実行に失敗しているので、「fatal error: unexpectedly found nil while unwrapping an Optional value」のエラーになるんだと思います。
info.plistにApp Transport Security Settingsの設定を追加してください。設定の仕方は「App Transport Security Settings」でググればたくさん出てきます。自分の環境ではこの設定後、正常稼働しました。

投稿2016/10/19 05:31

編集2016/10/19 05:33
fromageblanc

総合スコア2724

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

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

退会済みユーザー

退会済みユーザー

2016/10/19 08:08

App Transport Security SettingsのNSTemporaryExceptionAllowsInsecureHTTPLoadsにNSをつけ忘れていました。エラーメッセージの解説をいただけたおかげで設定のミスに気づくことができました、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問