在Xcode 8发布版本中,我发现了一个奇怪的场景.
这是代码,
let implicitlyUnwrappedOptionalString: String! = "implicitlyUnwrappedOptionalString"
let foo = implicitlyUnwrappedOptionalString
print(implicitlyUnwrappedOptionalString)
print(foo)
Run Code Online (Sandbox Code Playgroud)
这是结果:
implicitlyUnwrappedOptionalString
Optional("implicitlyUnwrappedOptionalString")
Run Code Online (Sandbox Code Playgroud)
上面的这些表明,当我将一个隐式展开的可选项分配给一个没有显式类型的变量时,该类型将被推断为一个可选类型,而不是它最初的类型,也就是隐式展开的可选类型.
我的Xcode已更新为8.任何人都可以验证Xcode 7.x中的行为吗?
更改是由于Swift版本更改还是Xcode?
Mar*_*n R 10
这是SE-0054废除ImplicitlyUnwrappedOptional类型的结果,该类型已在Swift 3中实现.从该提案中提取(强调添加):
但是,外观!在属性或变量声明的类型末尾不再表示声明具有IUO类型; 相反,它表示(1)声明具有可选类型,(2)声明具有一个属性,指示可以隐式强制其值....
如果可以使用强可选类型显式地检查表达式,那么它将是.但是,如果需要,类型检查器将回退到强制可选.此行为的影响是任何表达式的结果引用声明为T的值!要么是T型还是T型?例如,在以下代码中:
Run Code Online (Sandbox Code Playgroud)let x: Int! = 5 let y = x let z = x + 0... x被声明为IUO,但因为y类型的初始化器正确地检查为可选,所以y将被绑定为Int?类型.但是,z的初始化程序不使用声明为可选的x进行类型检查(没有带有可选的+的重载),因此编译器强制可选和类型检查初始化程序为Int.
在你的情况下,分配
let foo = implicitlyUnwrappedOptionalString
Run Code Online (Sandbox Code Playgroud)
让foo强大的可选项,如示例let y = x
从提案.
您可以foo通过添加显式类型注释来创建IUO
let foo: String! = implicitlyUnwrappedOptionalString
Run Code Online (Sandbox Code Playgroud)
但一般来说,您应该尝试在代码中摆脱IUO,如同一提案中所述:
除了一些特定情况,选项总是更安全的赌注,我们希望鼓励人们使用它们而不是IUO.
| 归档时间: |
|
| 查看次数: |
732 次 |
| 最近记录: |