現在名前をテキストフィールド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.
}
}
不足部分などありましたら追加するのでよろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
"user"
じゃなくて"USER"
のようですが。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
let 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にはそのための方法がいろいろ用意されています。
一例を挙げれば、
guard let jsonData = result as? NSDictionary else {
print("json is not NSDictionay.")
return
}
のようにguard節を用いる方法があります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
質問への追記・修正、ベストアンサー選択の依頼
fuzzball
2017/09/22 14:16
1個でいいので"user"のJSONを書いて下さい。
panyayan
2017/09/22 15:30
帰ってきたjsonは以下になります。SUCCESS: { USER = { userName = testuser; id = 1; name = Jason born; }; error = 0; }