Swift运算符和nil

Dar*_*rko 14 swift

这种行为有什么解释?

let x: Int? = nil
if x < 10 {
    print("x < 10")
}
Run Code Online (Sandbox Code Playgroud)

它打印"x <10".这不应该产生运行时错误或至少是编译器警告吗?

编辑:

我向Apple提交了一份错误报告,他们承认这是另一份报告的现有副本.所以这将由Apple以某种方式处理/修复.

Mar*_*n R 15

这里发生了两件事(无论我们喜不喜欢):首先,有一个操作员

public func <<T : Comparable>(lhs: T?, rhs: T?) -> Bool
Run Code Online (Sandbox Code Playgroud)

如果基础类型具有可比性,则会比较两个选项.行为没有记录(据我所知),但似乎 nilaka Optional<T>.None被认为少于所有非零值Optional<T>.Some(value).

第二, enum Optional有一个构造函数

/// Construct a non-`nil` instance that stores `some`.
public init(_ some: Wrapped)
Run Code Online (Sandbox Code Playgroud)

现在进来

if x < 10 { ... }
Run Code Online (Sandbox Code Playgroud)

lhs有类型Optional<Int>.< 运营商的唯一候选人是上述比较两个选项的候选人.因此,rhs也被推断为可选项,因此这相当于

if x < Optional<Int>.Some(10) { ... }
Run Code Online (Sandbox Code Playgroud)

更新:

此功能已在Swift 3(SE-0121 - 删除可选比较运算符)中删除,该代码不再与Xcode 8(目前为beta 6)编译.

  • 很好的解释.这是如此严重.:d (3认同)
  • 对我来说,这不仅仅是记录它.简单的问题:是否小于10?这种比较不应该是可能的.它在我的应用程序代码中创建了一个严重的错误. (2认同)