iPhone开发--Fatal error: Unexpectedly found nil while unwrapping an Optional value 解决办法
缘起:在Release模式下,iOS10解析一段数据出现了如下的错误提示(如果不手动解析,用第三库库解析例如SBJSON是不会出现此问题的)。Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value根据英文,简单的翻译下线程1:致命的错误:解包一个可选值的时候出现了一个意外的nil值出错代码位置
·
缘起:
在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。
参考资料:
更多推荐
已为社区贡献4条内容
所有评论(0)