3

我在 Swift 中有这样的 switch 语句:

switch tuple {
    case (let someObject, let current, nil):
        return true

    // Other cases...
}

元组是 type (SomeObject?, SomeObject, SomeObject?),我用英语说的是:匹配前两个元素为nil,而第三个(可选)nil 的情况。

Xcode 7 告诉我,由于我没有使用绑定someObjectcurrent,我应该用下划线替换它。但是如果我用下划线替换元组中的第一个元素,它是否也与第一个元素为 nil 的情况相匹配,因为这_意味着编译器会忽略该值?对于第一个元素为零的情况,我有一个单独的案例。

作为记录,我的代码看起来仍然像我期望的那样工作,但我想确定,我在任何地方都找不到任何文档。

4

1 回答 1

10

下划线匹配任何值(nil 或非 nil),但您的模式也是如此:

case (let someObject, let current, nil):

其中第一个let someObject匹配任何值(nil 或非 nil)。所以这实际上并不像你想要的那样工作。

可选类型定义为枚举:

enum Optional<T> : ... {
    case None
    case Some(T)
    // ....
}

nil相同Optional.None。因此你可以使用

case (.Some, _, nil):
// Alternatively: 
case (.Some, _, .None):

匹配第一个元素不是 nil 而最后一个元素是 nil 的情况。的中间元素(SomeObject?, SomeObject, SomeObject?)不是可选的,因此它不能为 nil。

Swift 2 / Xcode 7开始,在您的情况下,该x?模式可以用作 的同义词.Some(x)

case (_?, _, nil):

匹配第一个元素不是 nil 而最后一个元素是 nil 的情况。

于 2015-06-24T12:13:18.083 回答