Swift 4.1中隐式解包结合nil合并出现unexpected some()的原因
关于Xcode 9.3中Swift 4.1代码输出
some(2)的解释 这个问题我刚好熟悉,咱们一步步拆解来理清原因:
1. 变量的本质类型
你定义的new是Int!,也就是隐式可选类型——它本质上依然是Swift的Optional<Int>枚举类型,只是Swift会在大部分场景下自动帮你解包,但底层结构还是可选类型的枚举,包含.some(Wrapped)(对应有值)和.none(对应nil)两个case。
2. 代码赋值逻辑
这段代码里:
let old = "not an int" let new: Int! = Int(old) ?? 2
Int(old)尝试把字符串转为整数,失败后返回nil- 空合运算符
??会在左侧为nil时返回右侧的默认值2,所以new实际被赋值为Optional(2),也就是枚举的.some(2)实例。
3. 调试控制台的打印特性
在Swift 4.1搭配Xcode 9.3的调试环境里,直接打印隐式可选变量时,控制台会显示它的原始枚举形态,而非自动解包后的值。所以print(new)会输出some(2),对应Optional枚举的.some case和关联值2;而print(new!)是强制解包操作,直接取出枚举里的关联值,所以输出2。
需要补充的是:这种打印表现是旧版本Xcode调试器的特性,后续更新的Swift和Xcode版本中,隐式可选变量的打印已经更直观,直接打印会显示解包后的值,而非枚举形态。
内容的提问来源于stack exchange,提问作者Nabeel Khan
相关产品推荐
相关产品推荐

