2965


下記コードでのクラッシュの回避方法についてアドバイスいただきたいです。

ご回答宜しくお願い致します。  
![コード画像](https://i.stack.imgur.com/C8L3A.png)


CC BY-SA 3.0
2015-01-02T14:40:20.500
2957
2015-01-03T08:50:35.143
2020-06-17T08:14:45.997
-1
5981
question
swift json
swift - オプショナルでのクラッシュについて


`JSONObjectWithData`が`nil`を返していてランタイムエラーになっているのかもしれません。手元の`playground`で無効な`NSData`を渡したところ、同様のエラーを再現できました。代わりに

[code]

    let dict: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary
    
[/code]

などとするのはどうでしょうか。

  * `let`は`var`のままでも問題ないです
  * 左辺および右辺の組み合わせはいくつかバリエーションがあります（下記参照)

以下のコードをオンライン上で試しました。(<http://swiftstub.com/926044597/>)

`ok`となっているものは無効なデータでも動き(`nil`になる)、`ng`のものはランタイムエラーを吐きます。このサービスで吐かれるエラーは`playground`で吐かれるエラーとはちょっと違うのですが、参考程度にどうぞ。

[code]

    let txtNg = ""
    let txtOk = "{\"hoge\": {\"huga\":1, \"hige\":2}}"
    
    let data = txtNg.dataUsingEncoding(NSUTF8StringEncoding) as NSData!
    //let data = txtOk.dataUsingEncoding(NSUTF8StringEncoding) as NSData!
    
    var ok: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error:nil)
    ok?.allKeys
    println(ok)
    
    var ok2: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error:nil) as? NSDictionary
    ok2?.allKeys
    println(ok2)
    
    var ok3: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error:nil) as? NSDictionary
    ok3?.allKeys
    println(ok3)
    
    var ok4 = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error:nil) as? NSDictionary
    ok4?.allKeys
    println(ok4)
    
    //var ng = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error:nil) as NSDictionary
    //ng.allKeys
    //println(ng)
    
    //var ng2: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error:nil) as NSDictionary
    //ng2?.allKeys
    //println(ng2)
    
    //var ng3: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error:nil) as NSDictionary
    //ng3?.allKeys
    //println(ng3)
    
[/code]

また、英語版SOにも似たような質問がありましたので、参考になるかもしれません。

cf. [nsjsonserialization - JSON Serialization crashing in swift - Stack
Overflow](https://stackoverflow.com/questions/24187826/json-serialization-
crashing-in-swift)


CC BY-SA 3.0
2015-01-03T07:13:33.550
2965
2015-01-03T08:50:35.143
2017-05-23T12:38:56.083
-1
3313
2957
answer