web-dev-qa-db-ja.com

Swift "where"キーワード

免責事項:Swift noob

こんにちは、私は学習を始めたばかりですSwiftとSwiftプログラミング言語(WWDC中にリリースされたAppleの本))を経験していて、 'キーワードは。で使用されました

let vegetable = "red pepper"
switch vegetable {
case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
    let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?"
default:
    let vegetableComment = "Everything tastes good in soup."
}

抜粋:Apple Inc.「The Swift Programming Language。」iBooks。 https://itun.es/us/jEUH0.l

誰かが同等のものを別の言語(Java、c ++、obj-cなど)で説明したり表示したりできるとしたら、すばらしいでしょう。

申し訳ありませんが、これはどこにもありませんでした。

20
Alex

Swiftのswitchステートメントは、他のほとんどの言語で使用されているステートメントよりもはるかに強力です。単に値のグループから選択するのではなく、パターンマッチングを使用して、評価するcaseを選択します。あなたの例から各caseを見てみましょう:

_case "celery":
_

超シンプル-これは文字列_"celery"_にのみ一致します。

_case "cucumber", "watercress":
_

このケースは、どちらか文字列_"cucumber"_または文字列_"watercress"_と一致します。涼しい。他の言語では、おそらくこれらの両方を取得するためにフォールスルーケースを使用する必要があります。

_case let x where x.hasSuffix("pepper"):
_

このケースには、SwiftおよびCと比較した場合、Java switchステートメントに固有の2つの概念が含まれています。最初の概念は値バインディングです- -このステートメントの_let x_の部分は、一致した値を、ケースの本体をスコープとする定数xにバインドします。

次はwhere句です。これはifステートメントと同様にブールテストなので、式がtrueの場合にのみ大文字と小文字が一致します。この例では、x.hasSuffix("pepper")はバインドされた値を調べ、それが_"pepper"_で終わるかどうかを確認します。文字列_"red pepper"_、_"green pepper"_、および_"spicy hot pepper"_はすべて一致しますが、_"peppercorns"_は一致しません。

_default:
_

Swiftでは、switchステートメントは一致した値のすべての可能な値を使い果たす必要があるため、通常は_default:_ケースブロックで終了して、以前に一致しなかった値を処理します。手動ですべてのオプションを使い果たす可能性があるため、これが表示されないのは、enumをいくつかの値のみと一致させる場合のみです。

43
Nate Cook

1つのifステートメントに複数のオプションのバインディングを含め、where句を使用してブール条件をチェックできます。

if let firstNumber = Int("4"), secondNumber = Int("42") where firstNumber < secondNumber {
    print("\(firstNumber) < \(secondNumber)")
}
// prints "4 < 42
16
Joyal Clifford