Fatal error: Unexpectedly found nil while unwrapping an Optional value 解决办法

Fatal error: Unexpectedly found nil while unwrapping an Optional value 解决办法,第1张

缘起:
在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。

参考资料:

https://learnappmaking.com/found-nil-while-unwrapping-optional-value/

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/994531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存