缘起:
在Release模式下,iOS10解析一段数据出现了如下的错误提示(如果不手动解析,用第三库库解析例如SBJSON是不会出现此问题的)。

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

根据英文,简单的翻译下

线程1:致命的错误:解包一个可选值的时候出现了一个意外的nil值

出错代码位置如下:

if let array = body?.data as? [[String: Any]], array.count > 0 {
}

一看,应该是Any的值为nil了。
本着头疼医头,脚疼医脚的思维,把Any改为Any?,重写编译,依旧crash。为何呢?

于是顺藤摸瓜,找到了data的定义处

@property (nonatomic, strong, nullable) NSArray *data; //数据数组

data为NSArray类型的数组,且该数组的内容为字典,但是字典并未在初始化中体现,猜测iOS10中的Swift把字典的value当做是非optional类型。为了验证猜测,修改对data的定义,修改后的定义如下

@property (nonatomic, strong, nullable) NSArray<NSDictionary<NSString *, id>*> *data; //数据数组

再次编译,通过。

啰嗦几句:
何为可选值(Optional)呢?
在Swift中,可选值(Optional)是特殊的类型,它可以为

  • 可包含一个值
  • 或者不包含一个值(nil)
    当你声明一个值为可选值时,它可以为nil,你可以用如下方法声明一个值
let meaningOfLife:Int? = 42

这个在声明类型符号后的问号(Int?)代表着这个meaningOfLife值为可选值,所以下面的代码运行是没有问题的

meaningOfLife = nil

变量meaningOfLife是可选值,所以它的值可以为nil。下面的例子是不合法的

let age:Int = 99
age = nil // This line is not OK

因为一个变量为非可选值,它不能被设置为nil。

参考资料:

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐