更新 Xcode beta 5
Xcode beta 5 已解决了原先提出的问题,这可能使得本回答失效。
原始答案
这可能需要进一步解释,为什么它绝对不是不一致的行为而是简单的无效。
可选值必须始终位于实际操作数的右侧,不能位于其左侧。
通过两个简单的示例来查看该逻辑:
示例 1
对于以下代码行:
self.window?.backgroundColor = UIColor.redColor()
< LEFT ^ RIGHT >
可选项位于左侧,这意味着左侧可能为nil,在运行时以下操作数将出现在此处:
nil = UIColor.redColor()
这在任何层面上都是无效的,不需要进一步或复杂的解释 - 一个nil
不能分配给其他东西,这就是编译器不允许的原因。
NOTE: you may assume that the logical behaviour would be like this in the case of self.window = nil
:
nil.backgroundColor = UIColor.redColor()
but the documentation about Optional Chaining highlights a very important behaviour which explains why that is not happening at all:
Multiple queries can be chained together, and the entire chain fails gracefully if any link in the chain is nil
.
重点在于单词"entire",因此左侧将是nil = ...
而不是nil.backgroundColor = ...
,这与Objective-C不同。
例子2
另一个答案突出了另一种解决方法:
self.window?.setBackgroundColor(UIColor.redColor())
为什么这样做是有效的?这里不会有一点不一致吗?绝对不会。
实际上,这里的可选项位于操作数的右边,因为这行等于这行,但我们实际上并不关心在实践中得到void
。
let result: Void! = self.window?.setBackgroundColor(UIColor.redColor())
< LEFT ^ RIGHT >
正如您所见,这里根本没有任何不一致的地方,因为在 self.window = nil
的情况下,该行在运行时将等同于上面解释中的这一行:
let result: Void! = nil
这将是一个完全合法的操作数。
逻辑很简单,可选项必须始终位于操作数(或运算符)的右侧,在左侧它只能是非可选的值。
nil
指针设置为其他值一样 - 这是无效的操作数,而不是不一致性。 - holex