为什么不同层数的嵌套可选nil使用==比较返回false?
问题原因解释
核心根源是Swift多层Optional的自动升阶包装规则,以及nil字面量仅匹配当前层级的.none枚举值
1. 两个变量的原始存储结构
opt1: Int???等价于Optional<Optional<Optional<Int>>>, 赋值为nil时,存储结构为最外层的.noneopt2: Int??等价于Optional<Optional<Int>>, 赋值为nil时,存储结构为自身层级的最外层.none
2. 比较时的自动类型转换逻辑
当你对不同嵌套层数的Optional做相等比较时,Swift编译器会自动将嵌套层数少的类型向上包装到和层数多的类型一致,也就是opt2会被自动包装为Int???类型,此时它的存储结构变为.some(.none):最外层是.some(存在有效值),包裹的内层才是.none。
3. 模式匹配不生效的原因
Swift中的nil字面量仅匹配当前层级Optional的.none枚举值,嵌套内部的.none不会被外层的nil模式匹配到。
此时转换为同类型后的两个值结构完全不同:
- 转换后的
opt1:.none - 转换后的
opt2:.some(.none)
二者无法匹配case (nil, nil)分支,最终会进入default返回false。
验证代码
let opt1: Int??? = nil let opt2: Int?? = nil // 手动校验结构 if case .none = opt1 { print("opt1是最外层nil") // 正常输出 } if case .some(.none) = opt2 as Int??? { print("转换后的opt2是.some包裹的内层nil") // 正常输出 } // 直接对比二者结构 print(opt1 == .none) // 输出true print(opt2 as Int??? == .some(.none)) // 输出true
内容的提问来源于stack exchange,提问作者Joiner
相关产品推荐
相关产品推荐

