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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

iOS

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

Swift

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

Q&A

解決済

2回答

1574閲覧

検索時にfatal error: unexpectedly found nil while unwrapping

panyayan

総合スコア36

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

iOS

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

Swift

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

0グッド

0クリップ

投稿2017/09/21 10:42

編集2017/09/21 10:43

現在名前をテキストフィールドUSERNAMEを入力するとDBからその名前に関するデータをjsonとして取得。画面に名前を表示するアプリを作成しているのですが、fatal error: unexpectedly found nil while unwrapping an Optional valueと出てしまいます。
コードをなんども読み返して手を加えたりしているのですが解決しません。
オプショナル型などミスはしていないと思うのですが。どうか、ご教授お願いします

SearchViewController import UIKit import Alamofire class SearchViewController: UIViewController { //API let SEARCH_CODE = "API CODE" //devaultUserValue let defaultValues = UserDefaults.standard @IBOutlet weak var searchCodeFeild: UITextField! @IBOutlet weak var labelMessage: UILabel! @IBAction func searchBtn(_ sender: UIButton) { //Getting device code let parameters: Parameters=[ "username" : searchCodeFeild.text! ] //making post request Alamofire.request(SEARCH_CODE, method: .post, parameters: parameters).responseJSON { response in //printing response print(response) //getting the json value from the server if let result = response.result.value{ let jsonData = result as! NSDictionary //if there is no error if(!(jsonData.value(forKey: "error")as! Bool)){ let device = jsonData.value(forKey: "user") as! NSDictionary //ここでエラー //getting user value let deviceID = device.value(forKey: "id") as! Int let deviceName = device.value(forKey: "name") as! String let deviceCode = device.value(forKey: "usernaem") as! String self.defaultValues.set(deviceID, forKey: "id") self.defaultValues.set(deviceName, forKey: "name") self.defaultValues.set(deviceCode, forKey: "username") let resultViewController = self.storyboard?.instantiateViewController(withIdentifier: "ResultViewController") as! ResultViewController self.navigationController?.pushViewController(resultViewController, animated: true) self.dismiss(animated: false, completion: nil) }else{ self.labelMessage.text = "Sorry not find device" } } } if (defaultValues.object(forKey: "name") != nil){ print("have an data") } }
ResultViewController class ResultViewController: UIViewController { @IBOutlet weak var deviceNameFeild: UILabel! @IBAction func backBtn(_ sender: UIButton) { //userDefaultにあるデーターを消す UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) UserDefaults.standard.synchronize() let searchViewController = self.storyboard?.instantiateViewController(withIdentifier: "SearchViewController") as! SearchViewController self.navigationController?.pushViewController(searchViewController, animated: true) self.dismiss(animated: false, completion: nil) } override func viewDidLoad() { super.viewDidLoad() let backBtn = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: navigationController, action: nil) navigationItem.leftBarButtonItem = backBtn let defaultValues = UserDefaults.standard if let name = defaultValues.string(forKey: "name"){ //setting the name to label deviceNameFeild.text = name }else{ //send back to login view controller } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

ストーリーボードはこんな感じです
イメージ説明

不足部分などありましたら追加するのでよろしくお願いします。

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

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

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

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

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

fuzzball

2017/09/22 05:16

1個でいいので"user"のJSONを書いて下さい。
panyayan

2017/09/22 06:30

帰ってきたjsonは以下になります。SUCCESS: { USER = { userName = testuser; id = 1; name = Jason born; }; error = 0; }
guest

回答2

0

ベストアンサー

"user"じゃなくて"USER"のようですが。

投稿2017/09/22 06:44

fuzzball

総合スコア16731

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

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

panyayan

2017/09/22 06:56

ものすごく単純なミスでした。。。助かりましたありがとうございます!
guest

0

swift

1let device = jsonData.value(forKey: "user") as! NSDictionary

ここで
fatal error: unexpectedly found nil while unwrapping an Optional valueというfatal errorが出るということは、jsonData.value(forKey: "user")nilということです。

!を使うということは、そこで問題があればクラッシュするということをきちんと認識しておく必要があります。

!は危険を伴うため、なるべく使わないほうがいいでしょう。

Swiftにはそのための方法がいろいろ用意されています。
一例を挙げれば、

swift

1guard let jsonData = result as? NSDictionary else { 2 print("json is not NSDictionay.") 3 return 4}

のようにguard節を用いる方法があります。

投稿2017/09/21 11:05

MasakiHori

総合スコア3384

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問