2015-10-19 88 views
14

这种行为的解释是什么?Swift运营商和零

let x: Int? = nil 
if x < 10 { 
    print("x < 10") 
} 

它打印“x < 10”。这不应该产生运行时错误或至少一个编译器警告?

编辑:

我提交了一个bug报告给苹果,他们承认它作为其他报告已经存在的重复。所以这将由Apple以某种方式处理/修复。

+0

另外有趣的是'可选'应该被允许用'let'声明 - 它看起来像我认为是错误的 –

+1

它看起来像是一个错误,它可以工作,即使你直接比较nil,就像'if nil <-100' –

+1

很难相信这种基本语言水平上的错误。 – Darko

回答

15

两件事情发生在这里(无论我们喜欢与否):首先,有一个 操作

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)。

+3

很好的解释。尽管如此,这是非常重要的:D –

+0

我刚刚获得了同样的结果。 'Comparable'协议有一些*文档,它定义了默认的'<',但是,这个解释完全忽略了可选项。 – Sulthan

+0

它看起来像是一种类型,它特别丑陋。例如在操场'x Abizern