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

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

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

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2940閲覧

Swiftで読み込んだJSONがNULLのときにアプリが落ちる

ToshiyukiSato

総合スコア12

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/04/22 11:03

###前提・実現したいこと
Swift初心者です。
Swiftで外部APIからJSONを読み込んで、整形し画面表示しています。
JSONに値が入っているときは正常に動作しますが、JSONがNULLのときにエラーが表示されて、アプリが落ちてしまいます。
解決方法を探していくつか試したのですが、うまくいく方法を見つけられず悩んでいます。
初歩的な質問で大変申し訳ないのですが、アドバイスをいただけると大変ありがたいです。

###発生している問題・エラーメッセージ

Could not cast value of type 'NSNull' to 'NSArray'.

###該当のソースコード

Swift

1//APIのURLを定義 2let url = NSURL(string: "http://search.example.com/api/search?q=\(Query)") 3//リクエストヘッダを作る 4let req = NSURLRequest(URL: url!) 5//セッション設定をする 6let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 7let session = NSURLSession(configuration: configuration, delegate:nil, delegateQueue:NSOperationQueue.mainQueue()) 8//接続する 9let task = session.dataTaskWithRequest(req, completionHandler: { 10 (data, response, error) -> Void in 11 do { 12 self.json = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.AllowFragments ) as! NSArray 13 //データ再読み込み 14 self.result.reloadData() 15 } catch { 16 //エラー処理 17 } 18})

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

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

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

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

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

Stripe

2016/04/22 15:23

それで、JSONがNULLの時はどうしたいんですか?
ToshiyukiSato

2016/04/22 16:08

説明不足で申し訳ございません。 JSONがNULLのときは、アプリが落ちずに、画面に「エラーです」と表示を出したいと考えています。
guest

回答1

0

ベストアンサー

self.resultをreloadData()する前に、jsonがNULLかどうかを判定し、reloadData()するかエラーを表示するか、処理を分岐させてください。

投稿2016/04/22 16:42

Stripe

総合スコア2183

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

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

ToshiyukiSato

2016/04/25 11:43

ご教示をありがとうございます。 試してみたところ、jsonがNULLの時には self.json = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.AllowFragments ) as! NSArray の段階で前述のエラー文が表示されてしまい、 self.resultをreloadData()する前の段階でアプリが落ちてしまいます。 そのままエラー文を読むと 「NSNullをNSArrayにcastできない」 というエラーなのかと思いますが、対処方法がわからず悩んでいます。
Stripe

2016/04/25 14:58

if let json = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.AllowFragments ) as? NSArray { self.json = json self.result.reloadData() } else { // エラーを表示 }
ToshiyukiSato

2016/04/27 12:41

ありがとうございます! そのように実装するご指摘だったのですね。理解が追いつかず申し訳ございませんでした。 無事この方法で解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問