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

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

ただいまの
回答率

90.12%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,164

YUKImidaifucu

score 14

<わからないこと>
実行結果に出てくるこの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にうまく入っていないのではないかなと思います。
(初心者なので、合っているかわかりませんが、私はそうなのかな…?と思っています。間違えていたら教えてください。!!)

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

イメージ説明

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var setaiIDTextField: UITextField!

    @IBOutlet weak var resultLabel: UILabel!
    @IBAction func tapReturn() {
    }
 /* @IBOutlet weak var setaiNameLabel: UILabel!
    @IBOutlet weak var setaiIDTextField: UITextField!
    @IBOutlet weak var resultLabel: UILabel!
    @IBAction func tapReturn() {
    }
 */

    //@IBAction func tapSearch() {
    @IBAction func tapSearch() {
        print("tapped")

        guard let setaiIDText = setaiIDTextField.text else {
            //値がnilだったら終了
            print("nil")
            return
        }

        // リクエストするURLを作る
        //let urlStr = "http://192.168.0.16:3000/setai_masters/?usernamber=\(setaiIDText)"
        let urlStr = "http://192.168.0.16:3000/setai_masters/1"

        if let url = NSURL(string: urlStr){
            print("if in")
            // urlオブジェクトがnilでなかったら、検索処理オブジェクトを作る
            let urlSession = URLSession.shared
            print("made object")
            // 「検索処理が完了したら、onGetAddressを呼び出す」というタスクを作る
            let task = urlSession.dataTask(with: url as URL, completionHandler: self.onGetData)
            // タスクの実行
            task.resume()
            print("task start")
        }
    }
    //検索処理が完了したら実行する
    func onGetData(data: Data?,res: URLResponse?, error: Error?){
        print("data get")
        // 受け取ったdataをJSON解析する。エラーになったらcatchへジャンプする
        do{
            // dataのJSON解析実行
            let jsonDic = try JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSDictionary
            print("JSON analysis start")
            // 解析できた値を調べる
            if let code = jsonDic["code"] as? Int{
                // codeという項目が整数なら、住所検索APIからのコード情報
                if code != 200{
                    if let errmsg = jsonDic["message"] as? String{
                        print(errmsg)
                        //dispatch_async(dispatch_get_main_queue()){
                        DispatchQueue.main.async {
                            self.resultLabel.text = errmsg
                        }
                    }
                }
            }

            if let data = jsonDic["data"] as? NSDictionary{
                if let setai_name = data["setai_name"] as? String{
                    print("世帯IDは\(setaiIDTextField)です")
                    print("世帯名は\(setai_name)です")
                    //dispatch_async(dispatch_get_main_queue()){
                    DispatchQueue.main.async {
                        self.resultLabel.text = setai_name
                    }
                }
            }
        } catch {
            print("エラー")
            print(data)
        }

        //確認のためdataを表示する
        //print("確認用:")
        print(data!)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

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

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


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

// NSDictionary
let jsonDic = try JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSDictionary

// NSArray
let jsonDic = try JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSArray

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/22 20:44 編集

    やはり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 {
    の文に出てきました。

    キャンセル

  • 2017/01/22 20:56 編集

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

    キャンセル

  • 2017/01/22 21:40 編集

    本当ですね!なるほど!
    今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に結果を表示することはできませんでした…。
    「解析できた値を調べる」ところができていないようです…。

    キャンセル

  • 2017/01/22 23:11 編集

    {"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を設定し直して見てください。

    キャンセル

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る