Swift 5.8 日本語化計画 : Swift 5.8
パターン
パターン は、一つの値または複合した値の構造体を表します。例えば、タプル (1,2) の構造体は、2つの要素をカンマで区切ったリストです。パターンは一つの特定の値ではなく値の構造体を表すので、各種の値をそれらと一致させることができます。例えば、パターン (x,y) は、タプル (1,2) と一致し、他の2つの要素のタプルどれにでも一致します。パターンが値と一致するだけでなく、複合した値の一部または全部を抽出して、定数または変数名に各部分を結合できます。
Swift には、パターンには2種類の基本的なものがあります:どのような種類の値とも首尾よく一致するものと、実行時に指定された値と一致しないものがあります。
最初の種類のパターンは、単純な変数、定数、および optional の結合の値の構造を破壊するために使用されます。これには、ワイルドカードパターン、識別子 (ID) パターン、およびそれらを含む全ての値結合パターンまたはタプルパターンを含みます。これらのパターンの型注釈を指定して、特定の型の値とのみ一致するようにそれらを制約できます。
2番目の種類のパターンは、完全パターン一致に使用され、一致させようとする値は実行時には存在しないかもしれません。これらには、列挙型 case パターン、optional パターン、式パターン、および型キャストパターンを含みます。これらのパターンは、switch 文の case ラベル、do 文の catch 節、if、while、guard、 または for-in 文の case 条件の場合に使用します。
pattern → wildcard-pattern type-annotation?
pattern → identifier-pattern type-annotation?
pattern → value-binding-pattern
pattern → tuple-pattern type-annotation?
pattern → enum-case-pattern
pattern → optional-pattern
pattern → type-casting-pattern
pattern → expression-pattern
ワイルドカードパターン
ワイルドカードパターン は、全ての値に一致し、それらを無視し、アンダースコア (_ ) で構成されます。値が一致するかどうか気にしない時にはワイルドカードパターンを使用してください。たとえば、以下のコードはループの各反復で範囲の現在の値を無視し、閉じた範囲 1...3 を通じて反復します:
- for _ in 1...3 {
- // Do something three times.
- }
wildcard-pattern → _
識別子パターン
識別子パターン は、全ての値に一致し、変数または定数名に一致した値を結合します。たとえば、以下の定数の宣言で、someValue は、Int 型の値 42 と一致する識別子パターンです。
一致が成功した場合には、値 42 は、定数名 someValue に (代入され) 結合されます。
変数または定数宣言の左辺のパターンが識別子パターンである場合には、識別子パターンは、暗黙的に値結合パターンのサブパターンです。
identifier-pattern → identifier
値結合パターン
値結合パターン は、一致した値を変数や定数名に結合します。let キーワードで始まる定数の名前に一致した値を結合する値結合パターン。var キーワードで始まる変数の名前に結合するもの。
値結合パターン内の識別子パターンは、それらの一致する値に新しい名前の変数や定数を結合します。たとえば、タプルの要素を分解することができるし、対応する識別子パターンに各要素の値を結合できます。
- let point = (3, 2)
- switch point {
- // Bind x and y to the elements of point.
- case let (x, y):
- println("The point is at (\(x), \(y)).")
- }
- // prints "The point is at (3, 2)."
上記の例では、let はタプルパターン (x,y) 内の各識別子パターンに振り分けます。この動作のため、switch case の case let (x,y): と、case (let x, let y): は、同じ値に一致します。
value-binding-pattern → var pattern | let pattern
タプルパターン
タプルパターン は、括弧で囲まれたゼロ個以上のパターンのカンマで区切られたリストです。タプルパターンは、対応するタプル型の値と一致します。
型注釈を使用してタプル型の特定の種類に一致させてタプルパターンを制約できます。例えば、定数宣言では、let (x,y): (Int, Int) = (1,2) 内の (x, y): (Int, Int) のタプルパターンは、両方の要素が Int 型のタプル型にのみ一致します。
タプルパターンを for-in 文の中でパターンとして使う場合、または変数または定数宣言で使う場合は、それはワイルドカードパターン、識別子パターン、optional パターン、またはそれらを含む他のタプルパターンしか含むことができません。例えば、タプルパターン (x, 0) 内の要素 0 は式のパターンであるため、以下のコードは有効ではありません。
- let points = [(0, 0), (1, 0), (1, 1), (2, 0), (2, 1)]
- // This code isn't valid.
- for (x, 0) in points {
- /* ... */
- }
一つの要素を含むタプルパターンの周りの括弧は効果がありません。パターンは、その一つの要素の型の値と一致します。たとえば、以下は同じです。
- let a = 2                // a: Int = 2
- let (a) = 2              // a: Int = 2
- let (a): Int = 2       // a: Int = 2
tuple-pattern → ( tuple-pattern-element-list? )
tuple-pattern-element-list → tuple-pattern-element | tuple-pattern-element , tuple-pattern-element-list
tuple-pattern-element → pattern | identifier : pattern
列挙型 case パターン
列挙型 case パターン は、既存の列挙型の case に一致します。列挙型 case パターンは、switch 文の case ラベルに現れ、if,while,guard, 及び for-in 文の case 条件に現れます。
一致させようとしている列挙型 case に何らかの関連する値がある場合は、対応する列挙型 case パターンは、それぞれ関連する値に1つの要素を含むタプルパターンを指定しなければなりません。関連する値を含む列挙型 case に一致するように switch 文を使用する例については、関連する値 を参照してください。
列挙型 case パターンは、また optional で包み込みこまれたその case の値にも一致します。この単純化された構文により、optional のパターンを省略できます。Optional は列挙型として実装されているため、.none および .some は列挙型の case と同じ switch に表示されることに注意してください。
- enum SomeEnum { case left, right }
- let x: SomeEnum? = .left
- switch x {
- case .left:
- print("Turn left")
- case .right:
- print("Turn right")
- case nil:
- print("Keep going straight")
- }
- // Prints "Turn left"
enum-case-pattern → type-identifier? . enum-case-name tuple-pattern?
Optional パターン
optional パターン は、optional<Wrapped> 列挙型の some(Wrapped) case 内の包み込まれた値と一致します。Optional パターンは、識別子パターンとその直後に続く疑問符で構成され、列挙型 case パターンと同じ場所に表示されます。
optional パターンは Optional の列挙型の case パターンのシンタックスシュガーなので、以下は同等です:
- let someOptional: Int? = 42
- // Match using an enumeration case pattern.
- if case .some(let x) = someOptional {
- print(x)
- }
- // Match using an optional pattern.
- if case let x? = someOptional {
- print(x)
- }
optional パターンは、for-in 文内の optional 値の配列を反復処理する便利な方法を提供し、ループの本体を nil 以外の要素に対してのみ実行します。
- let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
- // Match only non-nil values.
- for case let number? in arrayOfOptionalInts {
- print("Found a \(number)")
- }
- // Found a 2
- // Found a 3
- // Found a 5
optional-pattern → identifier-pattern ?
型キャストパターン
型キャストパターンには2つあり、is パターンと as パターンです。is パターンは switch 文の case ラベルにのみ表れます。is と as パターンは、以下の形式です:
is <#type#>
<#pattern#> as <#type#>
実行時に、その値の型が、is パターンまたはその型のサブクラスの右辺に指定された型と同じである場合、 is パターンは値と一致します。is パターンは is 演算子のように動作し、どちらも型キャストを行いますが、返された型を捨てます。
実行時に、その値の型が、as パターンまたはその型のサブクラスの右辺に指定された型と同じである場合、 as パターンは値と一致します。一致が成功した場合、一致した値の型は、as パターンの右辺に指定された パターン にキャストされます。
is と as パターンで、値と一致するように、switch 文を使用する例については、Any と AnyObject 用の型キャスティング を参照してください。
type-casting-pattern → is-pattern | as-pattern
is-pattern → is type
as-pattern → pattern as type
式のパターン
式のパターン は、式の値を表します。式のパターンは switch 文の case ラベルにのみ表れます。
式のパターンによって表される式は、Swift 標準ライブラリの ~= 演算子を使用した入力式の値と比較されます。~= 演算子が true を返す場合一致は成功しています。デフォルトでは、~= 演算子は == 演算子を使用して、同じ型の2つの値を比較します。以下の例に示すように、それはまた、値が範囲内に含まれているかどうかをチェックすることによって、値と値の範囲を一致させることもできます。
- let point = (1, 2)
- switch point {
- case (0, 0):
- print("(0, 0) is at the origin.")
- case (-2...2, -2...2):
- print("(\(point.0), \(point.1)) is near the origin.")
- default:
- print("The point is at (\(point.0), \(point.1)).")
- }
- // prints "(1, 2) is near the origin."
カスタム式が一致する動作を提供するために ~= 演算子をオーバーロードできます。たとえば、point の文字列表現で、point 式を比較するために上記の例を書き換えることができます。
- // Overload the ~= operator to match a string with an integer
- func ~= (pattern: String, value: Int) -> Bool {
- return pattern == "\(value)"
- }
- switch point {
- case ("0", "0"):
- print("(0, 0) is at the origin.")
- default:
- print("The point is at (\(point.0), \(point.1)).")
- }
- // prints "The point is at (1, 2)."
expression-pattern → expression
前:属性 次:汎用パラメータと引数
トップへ
トップへ
トップへ
トップへ