这种行为的解释是什么?Swift运营商和零
let x: Int? = nil
if x < 10 {
print("x < 10")
}
它打印“x < 10”。这不应该产生运行时错误或至少一个编译器警告?
编辑:
我提交了一个bug报告给苹果,他们承认它作为其他报告已经存在的重复。所以这将由Apple以某种方式处理/修复。
这种行为的解释是什么?Swift运营商和零
let x: Int? = nil
if x < 10 {
print("x < 10")
}
它打印“x < 10”。这不应该产生运行时错误或至少一个编译器警告?
编辑:
我提交了一个bug报告给苹果,他们承认它作为其他报告已经存在的重复。所以这将由Apple以某种方式处理/修复。
两件事情发生在这里(无论我们喜欢与否):首先,有一个 操作
public func <<T : Comparable>(lhs: T?, rhs: T?) -> Bool
其中如果基础类型是可比比较两个自选项目。 行为没有记录(据我所知),但似乎 nil
又名Optional<T>.None
被认为是比所有非零 值Optional<T>.Some(value)
。
其次,enum Optional
有一个构造函数
/// Construct a non-`nil` instance that stores `some`.
public init(_ some: Wrapped)
现在
if x < 10 { ... }
的LHS的类型为Optional<Int>
。运营商的唯一候选人是上述比较两个可选项的人选。 因此RHS被推断为一个可选的一样,所以这 相当于
if x < Optional<Int>.Some(10) { ... }
更新:
此功能已在夫特3被除去(SE-0121 – Remove Optional Comparison Operators),并且码不再编译Xcode 8 (目前beta 6)。
另外有趣的是'可选'应该被允许用'let'声明 - 它看起来像我认为是错误的 –
它看起来像是一个错误,它可以工作,即使你直接比较nil,就像'if nil <-100' –
很难相信这种基本语言水平上的错误。 – Darko