背景
开发中遇到几次了,记录一下。
先自我翻译一下:解包的时候与nil不期而遇。
比如下面这段代码:
let dict = ["first" : "1"]
let str: String = (dict["second"])!
print(str)
运行后控制台报错:
fatal error: unexpectedly found nil while unwrapping an Optional value
崩溃的原因就是dict["second"]
为nil,对nil强制取值而崩溃。
项目中的崩溃就是这样导致的:后台返回的json跟你预期的不一致,你想在一个字典里强行取出一个不存在的key对应的value。
容错处理
方案一:使用可选链表表达式
let dict = ["first" : "1"]
let str: String? = dict["second"]
print(str ?? "2") // 如果为空就打印“2”
方案二:使用OC版的if判断
let dict = ["first" : "1"]
if (dict["second"] != nil) {
print(dict["second"]!)
} else {
print("没这个key")
}
之所以称其为OC版的if,是因为它让我想到了OC。
方案三:使用swift版的if判断
let dict = ["first" : "1"]
if let str: String = dict["second"] {
print(str)
} else {
print("没这个key")
}
不得不说,这很swift。
方案四:开启守护者模式
let dict = ["first" : "1"]
guard let str: String = dict["second"] else {
print("没这个key")
return
}
print(str)
总结
用"!"强制解包的时候要慎重,做好容错处理有备无患。
网友评论