You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:42:01