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

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

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

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

Swift

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

Q&A

1回答

3625閲覧

Swift エラー内容がわからない…

YUKImidaifucu

総合スコア16

iOS

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

Swift

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

0グッド

0クリップ

投稿2017/01/22 10:58

<わからないこと>
実行結果に出てくるこの3つのエラー?メッセージがわかりません…
検索しても、いまいちわかりませんでした。
どなたかご教授お願いします。

・2017-01-22 19:35:47.661718 userApp[13651:1318725] [] ____nwlog_simulate_crash_inner_block_invoke dlopen CrashReporterSupport failed

・2017-01-22 19:35:47.662473 userApp[13651:1318725] [] __nwlog_err_simulate_crash simulate crash failed "nw_socket_set_common_sockopts setsockopt SO_NOAPNFALLBK failed: [42] Protocol not available"

・2017-01-22 19:35:47.663922 userApp[13651:1318725] [] nw_socket_set_common_sockopts setsockopt SO_NOAPNFALLBK failed: [42] Protocol not available, dumping backtrace:
[x86_64] libnetcore-856.30.16
0 libsystem_network.dylib 0x0000000112249666 __nw_create_backtrace_string + 123
1 libnetwork.dylib 0x0000000112527006 nw_socket_add_input_handler + 3164
2 libnetwork.dylib

<作成しているアプリケーション>
アプリケーションで自作のwebサーバにアクセスして、データを取ってくるiOSアプリケーションを作成しています。
コード上のエラーメッセージは出ておらず、
欲しいデータのIDを入力して、検索ボタンを押すと、
Labelに検索結果のデータを表示するもので、
実行結果を見たところ、Webサーバからデータは取ってこれているようなのですが…
JSON解析のdoにうまく入っていないのではないかなと思います。
(初心者なので、合っているかわかりませんが、私はそうなのかな…?と思っています。間違えていたら教えてください。!!)

実行結果は、写真の感じです。

イメージ説明

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var setaiIDTextField: UITextField! 6 7 @IBOutlet weak var resultLabel: UILabel! 8 @IBAction func tapReturn() { 9 } 10 /* @IBOutlet weak var setaiNameLabel: UILabel! 11 @IBOutlet weak var setaiIDTextField: UITextField! 12 @IBOutlet weak var resultLabel: UILabel! 13 @IBAction func tapReturn() { 14 } 15 */ 16 17 //@IBAction func tapSearch() { 18 @IBAction func tapSearch() { 19 print("tapped") 20 21 guard let setaiIDText = setaiIDTextField.text else { 22 //値がnilだったら終了 23 print("nil") 24 return 25 } 26 27 // リクエストするURLを作る 28 //let urlStr = "http://192.168.0.16:3000/setai_masters/?usernamber=\(setaiIDText)" 29 let urlStr = "http://192.168.0.16:3000/setai_masters/1" 30 31 if let url = NSURL(string: urlStr){ 32 print("if in") 33 // urlオブジェクトがnilでなかったら、検索処理オブジェクトを作る 34 let urlSession = URLSession.shared 35 print("made object") 36 // 「検索処理が完了したら、onGetAddressを呼び出す」というタスクを作る 37 let task = urlSession.dataTask(with: url as URL, completionHandler: self.onGetData) 38 // タスクの実行 39 task.resume() 40 print("task start") 41 } 42 } 43 //検索処理が完了したら実行する 44 func onGetData(data: Data?,res: URLResponse?, error: Error?){ 45 print("data get") 46 // 受け取ったdataをJSON解析する。エラーになったらcatchへジャンプする 47 do{ 48 // dataのJSON解析実行 49 let jsonDic = try JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSDictionary 50 print("JSON analysis start") 51 // 解析できた値を調べる 52 if let code = jsonDic["code"] as? Int{ 53 // codeという項目が整数なら、住所検索APIからのコード情報 54 if code != 200{ 55 if let errmsg = jsonDic["message"] as? String{ 56 print(errmsg) 57 //dispatch_async(dispatch_get_main_queue()){ 58 DispatchQueue.main.async { 59 self.resultLabel.text = errmsg 60 } 61 } 62 } 63 } 64 65 if let data = jsonDic["data"] as? NSDictionary{ 66 if let setai_name = data["setai_name"] as? String{ 67 print("世帯IDは\(setaiIDTextField)です") 68 print("世帯名は\(setai_name)です") 69 //dispatch_async(dispatch_get_main_queue()){ 70 DispatchQueue.main.async { 71 self.resultLabel.text = setai_name 72 } 73 } 74 } 75 } catch { 76 print("エラー") 77 print(data) 78 } 79 80 //確認のためdataを表示する 81 //print("確認用:") 82 print(data!) 83 } 84 85 override func viewDidLoad() { 86 super.viewDidLoad() 87 // Do any additional setup after loading the view, typically from a nib. 88 } 89 90 override func didReceiveMemoryWarning() { 91 super.didReceiveMemoryWarning() 92 // Dispose of any resources that can be recreated. 93 } 94 95} 96 97

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

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

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

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

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

guest

回答1

0

JSONのパースで失敗しているようですね、どのような値が返ってきているか以下のコードをprint("data get")の後ろに追加して出力されたJSONを見てみてください。

swift

1print(NSString(data: data, encoding: String.Encoding.utf8.rawValue) ?? "data is nil")

※ NSDictionaryでは無くてNSArrayかもしれませんので、確認お願いします。

swift

1// NSDictionary 2let jsonDic = try JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSDictionary 3 4// NSArray 5let jsonDic = try JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSArray

投稿2017/01/22 11:26

_Kentarou

総合スコア8490

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

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

YUKImidaifucu

2017/01/22 12:43 編集

やはりJSONのパースの部分が原因なんですね〜… printの文章を追加して、見たら以下の実行結果が出ました! 少し長いですが… <!DOCTYPE html> <html> <head> <title>Projectname</title> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="l0B2H6ngyQcZPhJz9t9lIk9BJYwMTRggcybFW0XTkha5I19eWXR203lVVpM5vFomI3P/RNsnQjtitFoEM+X5mw==" /> <link rel="stylesheet" media="all" href="/assets/conversation_masters.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" /> <link rel="stylesheet" media="all" href="/assets/function_tables.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" /> <link rel="stylesheet" media="all" href="/assets/health_masters.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" /> <link rel="stylesheet" media="all" href="/assets/posts.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" /> <link rel="stylesheet" media="all" href="/assets/scaffolds.self-e31bf9e8f83c19ef389671f973d00a66ad3d8703f4e2996cab76aaf6cdb3a91d.css?body=1" data-turbolinks-track="reload" /> <link rel="stylesheet" media="all" href="/assets/schedule_masters.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" /> <link rel="stylesheet" media="all" href="/assets/setai_masters.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" /> <link rel="stylesheet" media="all" href="/assets/userdata_masters.self-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css?body=1" data-turbolinks-track="reload" /> <link rel="stylesheet" media="all" href="/assets/application.self-af04b226fd7202dfc532ce7aedb95a0128277937e90d3b3a3d35e1cce9e16886.css?body=1" data-turbolinks-track="reload" /> <script src="/assets/jquery.self-660adc51e0224b731d29f575a6f1ec167ba08ad06ed5deca4f1e8654c135bf4c.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/jquery_ujs.self-e87806d0cf4489aeb1bb7288016024e8de67fd18db693fe026fe3907581e53cd.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/turbolinks.self-c5acd7a204f5f25ce7a1d8a0e4d92e28d34c9e2df2c7371cd7af88e147e4ad82.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/action_cable.self-1641ec3e8ea24ed63601e86efcca7f9266e09f390e82199d56aa7e4bd50e1aa9.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/cable.self-6e0514260c1aa76eaf252412ce74e63f68819fd19bf740595f592c5ba4c36537.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/conversation_masters.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/function_tables.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/health_masters.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/posts.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/schedule_masters.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/setai_masters.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/userdata_masters.self-877aef30ae1b040ab8a3aba4e3e309a11d7f2612f44dde450b5c157aa5f95c05.js?body=1" data-turbolinks-track="reload"></script> <script src="/assets/application.self-b89234cf2659d7fedea75bca0b8d231ad7dfc2f3f57fcbaf5f44ed9dc384137b.js?body=1" data-turbolinks-track="reload"></script> </head> <body> <p id="notice"></p> <p> <strong>Setai:</strong> 1 </p> <p> <strong>Setai name:</strong> Test_Name </p> <a href="/setai_masters/1/edit">Edit</a> | <a href="/setai_masters">Back</a> </body> </html> エラー Optional(4126 bytes) 4126 bytes また、Arrayに変換すると、コードにエラーが出ました… cannot convert value of type 'String' to expected argument type 'int' がif let code = jsonDic["code"] as? Int { と if let errmsg = jsonDic["message"] as? String { の文に出てきました。
_Kentarou

2017/01/22 11:56 編集

取得しているデータがJSONでは無くてHTMLですね。 サーバーからはJSONを返す仕組みになっていますか?
YUKImidaifucu

2017/01/22 12:41 編集

本当ですね!なるほど! 今URLの部分を書き換えたら、jsonで検索結果が出てきました! data get {"id":1,"setai_id":1,"setai_name":"Test_Name","created_at":"2016-07-21T06:57:52.892Z","updated_at":"2016-07-21T08:16:56.177Z"} JSON analysis start 122 bytes しかし、Labelに結果を表示することはできませんでした…。 「解析できた値を調べる」ところができていないようです…。
_Kentarou

2017/01/22 14:12 編集

{"id":1,"setai_id":1,"setai_name":"Test_Name","created_at":"2016-07-21T06:57:52.892Z","updated_at":"2016-07-21T08:16:56.177Z"}まで取得出来ているのでしたら、現在のコードのkeyになっている"code"や"message"というのが無いのも分かると思います。 現在取得出来ているJSONに合わせて取得するkeyを設定し直して見てください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問