3

Swift には次のような switch ステートメントがあります。

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

    // Other cases...
}

タプルは type(SomeObject?, SomeObject, SomeObject?)であり、私が英語で言っているのは、最初の 2 つの要素が nil でなく、3 番目 (Optional)nilである場合に一致するということです。

someObjectXcode 7 は、バインディングとを使用しなかったのでcurrent、アンダースコアに置き換える必要があることを教えてくれます。_しかし、タプルの最初の要素をアンダースコアに置き換えた場合、コンパイラが値を無視することを意味するため、最初の要素が nil の場合にも一致しませんか? 最初の要素が 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 に答える