Swift 5迁移后出现[CLLocation]??语法,对双重可选值用法存疑
核心含义解释
[CLLocation]??是两层嵌套可选类型的简写,等价于Optional<Optional<[CLLocation]>>,此处的两个问号和空合运算符??没有任何关系,属于Swift可选类型的语法糖。
两层可选的产生原因
自动生成代码里的两层可选,是两个语法特性叠加的结果:
NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass:from:)方法本身的返回值就是[CLLocation]?类型:解档过程中如果类型不匹配、数据损坏,都会直接返回nil,第一层可选来自方法本身的返回定义。try?关键字会自动给执行结果再包一层可选:如果方法执行抛出错误,try?返回nil;如果方法执行成功,就把方法的返回值再包装成一层可选。
两者叠加之后,整个表达式的原始返回类型就是两层可选[CLLocation]??。
Xcode自动加as [CLLocation]??的原因
Swift 5对可选类型的推断规则相比旧版本更严格,旧版本编译器会隐式处理两层可选的解包逻辑,而Xcode自动迁移时为了完全对齐旧代码的执行行为,就显式加了这个类型转换,保证if let可以一次性解掉两层可选,只要两层都不为nil就进入分支。
简化写法参考
自动生成的写法可读性较差,你可以手动简化成逻辑完全等价的易读写法:
// 写法1:分步解包两层可选 if let optionalArray = try? NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass: CLLocation.self, from: coordinatesArrayData), let coordinatesArray = optionalArray { return coordinatesArray } // 写法2:可选绑定+类型转换二合一 if let coordinatesArray = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(coordinatesArrayData) as? [CLLocation] { return coordinatesArray }
内容的提问来源于stack exchange,提问作者user1816142
相关产品推荐
相关产品推荐

