在Xcode 8中隐式解包可选赋值

liu*_*in7 4 xcode ios swift

在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型?例如,在以下代码中:

let x: Int! = 5
let y = x
let z = x + 0
Run Code Online (Sandbox Code Playgroud)

... 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.