Swift中字典解析后的问题,!?两种拆包的差别

给出一个json,使用SwiftyJSON解析传给model,传进去是个字典,字典里有String,NSNumber,NSDoctionary,和NSArray。

正常情况下直接使用下面的解析方法即可:

id = dict.objectForKey("id") as! NSNumber

注意,此时是在正常情况下,即“id”对应是有value的,但问题是如果后台出错了,或请求出错了,返回的字典里没有这个字段了,或改名字了,那么这句话会静静的崩掉。

 

也许你已经注意到了,这句代码中使用了一个符号,就是as后面的“!”,“!”是什么意思呢?个人理解是:强制解包,解包不成功就崩掉。所以使用!要特别小心。

 

为什么要解包?这源于swift的新特性,类型推断,字典里的值到底是什么类型,swift会进行猜测,如果要接收的对象的类型正好是swift推断的类型,那么就会赋值成功,否则就会提示错误。

 

与“!”相近的有一个“?”,它也是拆包的,但是不同的是,不是强制拆包,如果拆包失败,就会返回一个nil给接受对象。这样就保证了赋值安全。例如下面判空一个数组:

 

var item:NSMutableArray?
item = dict["items"]?["items1"] as? NSMutableArray
if item != nil
{
    dictionary_selected = dict["items"]!["items1"] as! NSMutableArray
}
else
{
    print("empty array!")
}

 

此时就不会再字段不存在时崩掉了。

posted @ 2016-08-30 21:00  BuddyLiu  阅读(1811)  评论(0编辑  收藏  举报