swift – オプショナルでのクラッシュについて

投稿者: Anonymous

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

ご回答宜しくお願い致します。
コード画像

解決

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

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

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

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

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

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

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)

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

cf. nsjsonserialization – JSON Serialization crashing in swift – Stack Overflow

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *