diff --git a/SUMMARY.md b/SUMMARY.md index b7a592f6..ac2160af 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -33,7 +33,7 @@ * [拡張\(Extensions\)](language-guide/extensions.md) * [プロトコル\(Protocols\)](language-guide/protocols.md) * [ジェネリクス\(Generics\)](language-guide/generics.md) -* [Opaque 型\(Opaque Types\)](language-guide/opaque-types.md) +* [Opaque 型とBox プロトコル型\(Opaque Types and Boxed Types\)](language-guide/opaque-types.md) * [自動参照カウント ARC\(Automatic Reference Counting\)](language-guide/automatic-reference-counting.md) * [メモリ安全性\(Memory Safety\)](language-guide/memory-safety.md) * [アクセスコントロール\(Access Control\)](language-guide/access-control.md) diff --git a/language-guide/opaque-types.md b/language-guide/opaque-types.md index ec59b6f5..25862eb5 100644 --- a/language-guide/opaque-types.md +++ b/language-guide/opaque-types.md @@ -1,11 +1,15 @@ -# Opaque 型\(Opaque Types\) +# Opaque 型とBox 型\(Opaque Types and Boxed Types\) -最終更新日: 2022/12/3 +最終更新日: 2023/5/28 原文: https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html 値の型に関する実装の詳細を隠す。 -戻り値に不透明な型\(以下_Opaque 型_\)を持つ関数またはメソッドは、その戻り値の型情報を隠します。関数の戻り値の型として具体的な型を提供する代わりに、準拠するプロトコルの観点から戻り値を記述します。型情報を隠すことで、戻り値の基になる型を private のままにすることができるため、モジュールとモジュールを呼び出すコードの間に境界を設けることに役立ちます。プロトコル型の値を返すのとは異なり、Opaque 型は具体的な型情報を保持し続けます。コンパイラは型情報にアクセスできますが、モジュールのクライアントはアクセスできません。 +Swift は値の型情報を隠すために 2 つの方法を提供します。不透明な型\(以下_Opaque 型_\)と Box 型です。 +型情報を隠すことで、戻り値の基になる型を private のままにすることができるため、モジュールとモジュールを呼び出すコードの間に境界を設けることに役立ちます。戻り値に Opaque 型を持つ関数またはメソッドは、その戻り値の型情報を隠します。関数の戻り値の型として具体的な型を提供する代わりに、準拠するプロトコルの観点から戻り値を記述します。 +コンパイラは型情報にアクセスできますが、モジュールのクライアントはアクセスできません。 +Box プロトコル型は、任意の型のインスタンスを格納することができます。Box プロトコル型は、与えられたプロトコルに準拠する任意の型のインスタンスを格納することができます。 +ボックス型プロトコル型は型の同一性を保持しません。つまり、値の特定の型は実行時までわからず、また、異なる値が保存されるため、時間の経過とともに変化する可能性があります。 ## Opaque 型が解決する問題\(The Problem That Opaque Types Solve\) @@ -176,11 +180,52 @@ func `repeat`(shape: T, count: Int) -> some Collection { この場合、戻り値の基になる型は `T` によって異なります。どの形状が渡されても、`repeat(shape:count:)` はその形状の配列を作成して返します。それにもかかわらず、戻り値は常に同じ `[T]` の基になる型のため、Opaque な戻り値の型を持つ関数は単一の型の値のみを返す必要があるという要件に従います。 +## Box プロトコル型\(Boxed Protocol Types\) + +Box プロトコル型は存在型とも呼ばれることがありますが、これは「`T` がプロトコルに準拠するような型 `T` が存在する」という表現に由来しています。Box プロトコル型を作るには、プロトコルの名前の前に `any` と書きます。以下はその例です: + +```swift +struct VerticalShapes: Shape { + var shapes: [any Shape] + func draw() -> String { + return shapes.map { $0.draw() }.joined(separator: "\n\n") + } +} + +let largeTriangle = Triangle(size: 5) +let largeSquare = Square(size: 5) +let vertical = VerticalShapes(shapes: [largeTriangle, largeSquare]) +print(vertical.draw()) +``` + +上の例では、`VerticalShapes` は、`Shape` のタイプを `[any Shape]`、つまり Box Shape 型要素の配列、と宣言しています。配列の各要素には、異なる型を入れることができ、それらの型の各々は、`Shape` プロトコルに準拠する必要があります。この実行時の柔軟性をサポートするために、Swift は必要なときに間接層を追加します。つまり、この間接的な存在は*ボックス*と呼ばれ、パフォーマンスコストがかかります。 + +`VerticalShapes` 型の中で、コードは `Shape` プロトコルで必要とされるメソッド、プロパティ、およびサブスクリプトを使用することができます。例えば、`VerticalShapes` の `draw()` メソッドは、配列の各要素の `draw()` メソッドを呼び出します。`Shape` が `draw()` メソッドを要件にしているため、このメソッドを利用できます。これに対して、三角形の `size` プロパティや、`Shape` が要件していないプロパティやメソッドにアクセスしようとすると、エラーが発生します。 + +`Shape` に使用できる 3 つのタイプを対比してみましょう: + +- `struct VerticalShapes` と `var shapes: [S]` を書くことで、ジェネリクスを使い、ある特定の形状を要素とする配列を作り、その配列とやり取りをするすべてのコードから、その特定の型が識別できるようにする +- Opaque 型を使用する場合、`var shapes:[some Shape]` と書くと、特定の形状を要素とする配列を作成し、その特定の型の識別は隠されます +- Box プロトコル型を使って、`var shapes:[any Shape]` と書くと、異なる形状の要素を格納できる配列ができ、それらの型の識別は隠される + +この場合、Box プロトコル型は、`VerticalShapes` の呼び出し元が異なる種類の形状を一緒に混ぜることができる唯一のアプローチです。 + +Box 値の基礎となる型がわかっている場合は、`as` キャストを使用することができます。例えば、以下のような感じです: + +```swift +if let downcastTriangle = vertical.shapes[0] as? Triangle { + print(downcastTriangle.size) +} +// "5" +``` + +より詳細は[Downcasting\(ダウンキャスト\)](../language-guide/type-casting.md#downcasting)を参照ください。 + ## Opaque 型とプロトコルの違い\(Differences Between Opaque Types and Protocol Types\) -Opaque 型を返すことは、プロトコル型を関数の戻り値の型として使用する場合と非常によく似ていますが、これら 2 種類の戻り値の型は、型情報を保持するかどうかが異なります。Opaque 型は 1 つの特定の型を参照しますが、関数の呼び出し側はどの型を参照するかはわかりません。プロトコル型は、プロトコルに準拠する任意の型を参照できます。一般に、プロトコル型では、格納する値の基になる型についてより柔軟に対応でき、Opaque 型を使用すると、基になる型についてより強力な保証を行うことができます。 +Opaque 型を返すことは、Box プロトコル型を関数の戻り値の型として使用する場合と非常によく似ていますが、これら 2 種類の戻り値の型は、型情報を保持するかどうかが異なります。Opaque 型は 1 つの特定の型を参照しますが、関数の呼び出し側はどの型を参照するかはわかりません。Box プロトコル型は、プロトコルに準拠する任意の型を参照できます。一般に、Box プロトコル型では、格納する値の基になる型についてより柔軟に対応でき、Opaque 型を使用すると、基になる型についてより強力な保証を行うことができます。 -例えば、Opaque 型の代わりにプロトコル型を戻り値の型として使用する、`flip(_:)` のバージョンを次に示します: +例えば、Opaque 型の代わりに Box プロトコル型を戻り値の型として使用する、`flip(_:)` のバージョンを次に示します: ```swift func protoFlip(_ shape: T) -> Shape { @@ -210,11 +255,11 @@ protoFlippedTriangle == sameThing // エラー この例の最終行のエラーは、いくつかの理由で発生します。当面の問題は、`Shape` のプロトコル要件に `==` 演算子が含まれていないことです。追加しようとすると、次に遭遇する問題は、`==` 演算子がその左辺と右辺の引数の型を知る必要があることです。この種の演算子は通常、`Self` 型の引数を取り、プロトコルに準拠する具体的な型に一致しますが、プロトコルに `Self` 要件を追加すると、プロトコルを型として使用することができなくなります。 -プロトコル型を関数の戻り値の型として使用すると、プロトコルに準拠する任意の型を柔軟に返すことができます。ただし、その柔軟性によって、返された値の一部の操作が犠牲になります。この例では、プロトコル型では保持されない特定の型情報に依存しているため、`==` 演算子が使用できないことを示しています。 +Box プロトコル型を関数の戻り値の型として使用すると、プロトコルに準拠する任意の型を柔軟に返すことができます。ただし、その柔軟性によって、返された値の一部の操作が犠牲になります。この例では、Box プロトコル型では保持されない特定の型情報に依存しているため、`==` 演算子が使用できないことを示しています。 -このアプローチのもう 1 つの問題は、形状変換をネストできないことです。三角形を反転した結果は、`Shape` 型の値で、`protoFlip(_:)` 関数は、`Shape` プロトコルに準拠した何らかの型の引数を取ります。ただし、プロトコル型はそのプロトコル自体に準拠しません。`protoFlip(_:)` によって返される値は `Shape` に準拠していません。これは、反転した形状が `protoFlip(_:)` の有効な引数ではないため、複数の変換を適用する `protoFlip(protoFlip(smallTriangle))` のようなコードが無効だということを意味します。 +このアプローチのもう 1 つの問題は、形状変換をネストできないことです。三角形を反転した結果は、`Shape` 型の値で、`protoFlip(_:)` 関数は、`Shape` プロトコルに準拠した何らかの型の引数を取ります。ただし、Box プロトコル型はそのプロトコル自体に準拠しません。`protoFlip(_:)` によって返される値は `Shape` に準拠していません。これは、反転した形状が `protoFlip(_:)` の有効な引数ではないため、複数の変換を適用する `protoFlip(protoFlip(smallTriangle))` のようなコードが無効だということを意味します。 -対照的に、Opaque 型は、基になる型情報を保持します。Swift は関連型を推論できるため、プロトコル型を戻り値として使用できない場所で Opaque 型な戻り値の型を使用できます。例えば、これは [Generics\(ジェネリクス\)](generics.md)の `Container` プロトコルの別のバージョンです: +対照的に、Opaque 型は、基になる型情報を保持します。Swift は関連型を推論できるため、Box プロトコル型を戻り値として使用できない場所で Opaque 型な戻り値の型を使用できます。例えば、これは [Generics\(ジェネリクス\)](generics.md)の `Container` プロトコルの別のバージョンです: ```swift protocol Container { diff --git a/language-guide/protocols.md b/language-guide/protocols.md index c630189b..d1145f69 100644 --- a/language-guide/protocols.md +++ b/language-guide/protocols.md @@ -35,6 +35,11 @@ class SomeClass: SomeSuperclass, FirstProtocol, AnotherProtocol { } ``` +> NOTE: +> プロトコルは型のため、 +> Swiftの他の型に一致するように(`Int`、`String` や `Double` など) +> 名前は大文字から始めてください。(`FullyNamed` や `RandomNumberGenerator` など) + ## プロパティ要件\(Property Requirements\) プロトコルは、特定の名前と型のインスタンスプロパティまたは型プロパティを要件にできます。プロトコルでは、格納プロパティか計算プロパティかを指定しません。必要なプロパティの名前と型を指定するだけです。また、プロトコルは、各プロパティが get のみか、get/set どちらも必要かどうかも指定します。 @@ -245,54 +250,16 @@ class SomeSubClass: SomeSuperClass, SomeProtocol { ## 型としてのプロトコル\(Protocols as Types\) -プロトコルは、実際には機能を実装しません。それにもかかわらず、コード内で完全な型としてプロトコルを使用できます。プロトコルを型として使用することは、_存在型_と呼ばれることもあります。これは、「T がプロトコルに準拠するような型 T が存在する」というフレーズから来ています。 - -次のような他の型が許可されている多くの場所でプロトコルを使用できます。 - -* 関数、メソッド、またはイニシャライザのパラメータの型または戻り値の型として -* 定数、変数、またはプロパティの型として -* 配列、辞書、またはその他のコンテナ内のアイテムの型として - -> NOTE -> プロトコルは型であるため、他の型 \(`Int`、`String`、`Double` など\) と同じように名前を大文字で始めます。\(`FullyNamed` や `RandomNumberGenerator` など\) - -型として使用されるプロトコルの例を次に示します: - -```swift -class Dice { - let sides: Int - let generator: RandomNumberGenerator - init(sides: Int, generator: RandomNumberGenerator) { - self.sides = sides - self.generator = generator - } - func roll() -> Int { - return Int(generator.random() * Double(sides)) + 1 - } -} -``` - -この例では、ボードゲームで使用する n 面のサイコロを表す `Dice` という新しいクラスを定義しています。`Dice` のインスタンスには、側面の数を表す `sides` と呼ばれる整数のプロパティと、ダイスの出目を作成するための乱数ジェネレータを提供する `generator` と呼ばれるプロパティがあります。 - -`generator` プロパティの型は `RandomNumberGenerator` です。したがって、`RandomNumberGenerator` プロトコルに準拠する任意の型のインスタンスを設定できます。このプロパティに割り当てるインスタンスには、インスタンスが `RandomNumberGenerator` プロトコルに準拠する必要があることを除いて、他に何も必要ありません。型は `RandomNumberGenerator` なので、`Dice` クラス内のコードは、このプロトコルに準拠する `generator` のみを使用できます。つまり、その具体的なジェネレータの型で定義されているメソッドやプロパティを使用することはできません。ただし、[Downcasting\(ダウンキャスト\)](../language-guide/type-casting.md#downcasting)で説明されているように、スーパークラスからサブクラスにダウンキャストできるのと同じ方法で、プロトコル型から準拠した具体的な型にダウンキャストできます。 +プロトコルは、実際には機能を実装しません。 +それにもかかわらず、コード内で型としてプロトコルを使用できます。 -`Dice` には、初期状態を設定するためのイニシャライザもあります。このイニシャライザには、`RandomNumberGenerator` 型の `generator` と呼ばれるパラメータがあります。新しい `Dice` インスタンスを初期化するときに、このパラメータに `RandomNumberGenerator` に準拠する型の値を渡すことができます。 +プロトコルを型として使用する最も一般的な方法は、プロトコルをジェネリック制約として使用することです。ジェネリック制約を持つコードは、プロトコルに準拠する任意の型を扱うことができ、特定の型は API を使用する側のコードで選択されます。例えば、引数を取る関数を呼び出したとき、その引数の型がジェネリックであれば、呼び出し元がその型を選びます。 -`Dice` は、1 からサイコロの面の数までの整数値を返す 1 つのインスタンスメソッド、`roll` を提供しています。このメソッドは、ジェネレータの `random()` メソッドを呼び出して `0.0` から `1.0` の間の新しい乱数を作成し、この乱数を使用して正しい範囲内でサイコロの目を作成します。`generator` は `RandomNumberGenerator` に準拠することがわかっているため、呼び出すべき `random()` メソッドが存在していることは保証されています。 +Opaque 型を持つコードは、プロトコルに準拠した何らかの型を使って機能します。基本的な型はコンパイル時に判明し、API 実装はその型を選択しますが、その型の正体は API のクライアントから隠されています。例えば、ある関数の戻り値の型を隠し、その値があるプロトコルに準拠していることだけを保証します。 -`Dice` クラスを使用して、`LinearCongruentialGenerator` インスタンスを乱数ジェネレータとして使用して、6 面体のサイコロを作成する方法を次に示します: +Box プロトコル型を持つコードは、プロトコルに準拠する、実行時に選択された任意の型で動作します。この実行時の柔軟性をサポートするために、Swift は必要なときに間接的なレイヤーを追加します。これは、*ボックス*として知られており、これはパフォーマンスコストを伴います。この柔軟性が理由で、Swift はコンパイル時に基礎となる型を知らなりません。つまり、プロトコルによって必要とされるメンバのみにアクセスできることを意味します。基礎となる型で定義された他の API にアクセスするには、実行時にキャストが必要です。 -```swift -var d6 = Dice(sides: 6, generator: LinearCongruentialGenerator()) -for _ in 1...5 { - print("Random dice roll is \(d6.roll())") -} -// Random dice roll is 3 -// Random dice roll is 5 -// Random dice roll is 4 -// Random dice roll is 5 -// Random dice roll is 4 -``` +プロトコルをジェネリック制約として使用することについては、[ジェネリクス\(Generics\)](../language-guide/generics.md)を参照してください。Opaque 型と Box プロトコル型については、[Opaque 型とBox プロトコル型\(Opaque Types and Boxed Types\)](language-guide/opaque-types.md)を参照してください。 ## 委譲\(Delegation\) diff --git a/language-reference/summary-of-the-grammar.md b/language-reference/summary-of-the-grammar.md index 7223a719..2bc6f482 100644 --- a/language-reference/summary-of-the-grammar.md +++ b/language-reference/summary-of-the-grammar.md @@ -1,872 +1,1676 @@ # 文法のまとめ\(Summary of the Grammar\) -最終更新日: 2023/5/27 +最終更新日: 2023/5/28 原文: https://docs.swift.org/swift-book/ReferenceManual/zzSummaryOfTheGrammar.html ## Lexical Structure\(構文の構造\) -> GRAMMAR OF WHITESPACE -> whitespace → [whitespace-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_whitespace-item) [whitespace](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_whitespace)opt -> whitespace-item → [line-break](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_line-break) -> whitespace-item → [inline-space](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_inline-space) -> whitespace-item → [comment](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment) -> whitespace-item → [multiline-comment](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment) -> whitespace-item → U+0000, U+000B, または U+000C -> line-break → U+000A -> line-break → U+000D -> line-break → U+000D に続く U+000A -> inline-spaces → [inline-space](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_inline-space) [inline-spaces](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_inline-spaces)opt -> inline-space → U+0009 または U+0020 -> comment → `//` [comment-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment-text) [line-break](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_line-break) -> multiline-comment → `/*` [multiline-comment-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment-text) `*/` -> comment-text → [comment-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment-text-item) [comment-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment-text)opt -> comment-text-item → U+000A または U+000D を除く任意のUnicodeスカラ値 -> multiline-comment-text → [multiline-comment-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment-text-item) [multiline-comment-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment-text)opt -> multiline-comment-text-item → [multiline-comment](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-comment) -> multiline-comment-text-item → [comment-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_comment-text-item) -> multiline-comment-text-item → `/*` または `*/` を除く任意のUnicodeスカラ値 - -> GRAMMAR OF AN IDENTIFIER -> identifier → [identifier-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-head) [identifier-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-characters)opt -> identifier → **\`** [identifier-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-head) [identifier-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-characters)opt **\`** -> identifier → [implicit-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_implicit-parameter-name) -> identifier → [property-wrapper-projection](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_property-wrapper-projection) -> identifier-list → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) \| [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `,` [identifier-list](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-list) -> identifier-head → 大文字または小文字の A ~ Z -> identifier-head → `_` -> identifier-head → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, または U+00B7–U+00BA -> identifier-head → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, または U+00F8–U+00FF -> identifier-head → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, または U+180F–U+1DBF -> identifier-head → U+1E00–U+1FFF -> identifier-head → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, または U+2060–U+206F -> identifier-head → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, または U+2776–U+2793 -> identifier-head → U+2C00–U+2DFF または U+2E80–U+2FFF -> identifier-head → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, または U+3040–U+D7FF -> identifier-head → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, または U+FE30–U+FE44 -> identifier-head → U+FE47–U+FFFD -> identifier-head → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, または U+40000–U+4FFFD -> identifier-head → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, または U+80000–U+8FFFD -> identifier-head → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, または U+C0000–U+CFFFD -> identifier-head → U+D0000–U+DFFFD または U+E0000–U+EFFFD -> identifier-character → 数値 0 ~ 9 -> identifier-character → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, または U+FE20–U+FE2F -> identifier-character → [identifier-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-head) -> identifier-characters → [identifier-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-character) [identifier-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-characters)opt -> implicit-parameter-name → `$` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) -> property-wrapper-projection → `$` [identifier-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-characters) - -> GRAMMAR OF A LITERAL -> literal → [numeric-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_numeric-literal) \| [string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal) \| [boolean-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_boolean-literal) \| [nil-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_nil-literal) -> numeric-literal → `-`opt [integer-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_integer-literal) \| `-`opt [floating-point-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_floating-point-literal) -> boolean-literal → `true` \| `false` -> nil-literal → `nil` - -> GRAMMAR OF AN INTEGER LITERAL -> integer-literal → [binary-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-literal) -> integer-literal → [octal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-literal) -> integer-literal → [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) -> integer-literal → [hexadecimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal) -> binary-literal → `0b` [binary-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-digit) [binary-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-literal-characters)opt -> binary-digit → 数値 0 または 1 -> binary-literal-character → [binary-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-digit) \| `_` -> binary-literal-characters → [binary-literal-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-literal-character) [binary-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_binary-literal-characters)opt -> octal-literal → `0o` [octal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-digit) [octal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-literal-characters)opt -> octal-digit → 数値 0 ~ 7 octal-literal-character → [octal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-digit) \| `_` -> octal-literal-characters → [octal-literal-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-literal-character) [octal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_octal-literal-characters)opt -> decimal-literal → [decimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digit) [decimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal-characters)opt -> decimal-digit → 数値 0 ~ 9 -> decimal-digits → [decimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digit) [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits)opt -> decimal-literal-character → [decimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digit) \| `_` -> decimal-literal-characters → [decimal-literal-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal-character) [decimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal-characters)opt -> hexadecimal-literal → `0x` [hexadecimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-digit) [hexadecimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal-characters)opt -> hexadecimal-digit → 数値 0 ~ 9、 a ~ f、または A ~ F -> hexadecimal-literal-character → [hexadecimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-digit) \| `_` -> hexadecimal-literal-characters → [hexadecimal-literal-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal-character) [hexadecimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal-characters)opt - -> GRAMMAR OF A FLOATING-POINT LITERAL -> floating-point-literal → [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) [decimal-fraction](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-fraction)opt [decimal-exponent](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-exponent)opt -> floating-point-literal → [hexadecimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal) [hexadecimal-fraction](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-fraction)opt [hexadecimal-exponent](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-exponent) -> decimal-fraction → `.` [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) -> decimal-exponent → [floating-point-e](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_floating-point-e) [sign](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_sign)opt [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) -> hexadecimal-fraction → `.` [hexadecimal-digit](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-digit) [hexadecimal-literal-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_hexadecimal-literal-characters)opt -> hexadecimal-exponent → [floating-point-p](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_floating-point-p) [sign](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_sign)opt [decimal-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-literal) -> floating-point-e → `e` \| `E` -> floating-point-p → `p` \| `P` -> sign → `+` \| `-` - -> GRAMMAR OF A STRING LITERAL -> string-literal → [static-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_static-string-literal) \| [interpolated-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_interpolated-string-literal) -> string-literal-opening-delimiter → [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter)opt `"` -> string-literal-closing-delimiter → `"` [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter)opt -> static-string-literal → [string-literal-opening-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal-opening-delimiter) [quoted-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_quoted-text)opt [string-literal-closing-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal-closing-delimiter) -> static-string-literal → [multiline-string-literal-opening-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-string-literal-opening-delimiter) [multiline-quoted-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-quoted-text)opt [multiline-string-literal-closing-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-string-literal-closing-delimiter) -> multiline-string-literal-opening-delimiter → [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter) `"""` -> multiline-string-literal-closing-delimiter → `"""` [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter) -> extended-string-literal-delimiter → `#` [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter)opt -> quoted-text → [quoted-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_quoted-text-item) [quoted-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_quoted-text)opt -> quoted-text-item → [escaped-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escaped-character) -> quoted-text-item → **"**、**\\**、 U+000A、または U+000D を除く任意のUnicodeスカラ値 -> multiline-quoted-text → [multiline-quoted-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-quoted-text-item) [multiline-quoted-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-quoted-text)opt -> multiline-quoted-text-item → [escaped-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escaped-character) -> multiline-quoted-text-item → **\\** を除く任意のUnicodeスカラ値 -> multiline-quoted-text-item → [escaped-newline](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escaped-newline) -> interpolated-string-literal → [string-literal-opening-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal-opening-delimiter) [interpolated-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_interpolated-text)opt [string-literal-closing-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_string-literal-closing-delimiter) -> interpolated-string-literal → [multiline-string-literal-opening-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-string-literal-opening-delimiter) [multiline-interpolated-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-interpolated-text)opt [multiline-string-literal-closing-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-string-literal-closing-delimiter) -> interpolated-text → [interpolated-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_interpolated-text-item) [interpolated-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_interpolated-text)opt -> interpolated-text-item → `\(` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` \| [quoted-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_quoted-text-item) -> multiline-interpolated-text → [multiline-interpolated-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-interpolated-text-item) [multiline-interpolated-text](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-interpolated-text)opt -> multiline-interpolated-text-item → `\(` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` \| [multiline-quoted-text-item](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_multiline-quoted-text-item) -> escape-sequence → `\` [extended-string-literal-delimiter](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_extended-string-literal-delimiter) -> escaped-character → [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `0` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `\` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `t` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `n` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `r` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `"` \| [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `'` -> escaped-character → [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) `u` `{` [unicode-scalar-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_unicode-scalar-digits) `}` -> unicode-scalar-digits → 0 から 8 までの16進数 -> escaped-newline → [escape-sequence](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_escape-sequence) [inline-spaces](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_inline-spaces)opt [line-break](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_line-break) - -> GRAMMAR OF OPERATORS -> operator → [operator-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-head) [operator-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-characters)opt -> operator → [dot-operator-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_dot-operator-head) [dot-operator-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_dot-operator-characters) -> operator-head → `/` \| `=` \| `-` \| `+` \| `!` \| `*` \| `%` \| `<` \| `>` \| `&` \| `|` \| `^` \| `~` \| `?` -> operator-head → U+00A1–U+00A7 -> operator-head → U+00A9 または U+00AB -> operator-head → U+00AC または U+00AE -> operator-head → U+00B0–U+00B1 -> operator-head → U+00B6, U+00BB, U+00BF, U+00D7, または U+00F7 -> operator-head → U+2016–U+2017 -> operator-head → U+2020–U+2027 -> operator-head → U+2030–U+203E -> operator-head → U+2041–U+2053 -> operator-head → U+2055–U+205E -> operator-head → U+2190–U+23FF -> operator-head → U+2500–U+2775 -> operator-head → U+2794–U+2BFF -> operator-head → U+2E00–U+2E7F -> operator-head → U+3001–U+3003 -> operator-head → U+3008–U+3020 -> operator-head → U+3030 -> operator-character → [operator-head](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-head) -> operator-character → U+0300–U+036F -> operator-character → U+1DC0–U+1DFF -> operator-character → U+20D0–U+20FF -> operator-character → U+FE00–U+FE0F -> operator-character → U+FE20–U+FE2F -> operator-character → U+E0100–U+E01EF -> operator-characters → [operator-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-character) [operator-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-characters)opt -> dot-operator-head → `.` -> dot-operator-character → `.` \| [operator-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator-character) -> dot-operator-characters → [dot-operator-character](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_dot-operator-character) [dot-operator-characters](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_dot-operator-characters)opt -> infix-operator → [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> prefix-operator → [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> postfix-operator → [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) +> Grammar of whitespace: +> +> *whitespace* → *whitespace-item* *whitespace*_?_ +> +> *whitespace-item* → *line-break* +> +> *whitespace-item* → *inline-space* +> +> *whitespace-item* → *comment* +> +> *whitespace-item* → *multiline-comment* +> +> *whitespace-item* → U+0000, U+000B, または U+000C +> +> +> +> *line-break* → U+000A +> +> *line-break* → U+000D +> +> *line-break* → U+000D followed by U+000A +> +> +> +> *inline-spaces* → *inline-space* *inline-spaces*_?_ +> +> *inline-space* → U+0009 または U+0020 +> +> +> +> *comment* → **`//`** *comment-text* *line-break* +> +> *multiline-comment* → **`/*`** *multiline-comment-text* **`*/`** +> +> +> +> *comment-text* → *comment-text-item* *comment-text*_?_ +> +> *comment-text-item* → Any Unicode scalar value except U+000A または U+000D +> +> +> +> *multiline-comment-text* → *multiline-comment-text-item* *multiline-comment-text*_?_ +> +> *multiline-comment-text-item* → *multiline-comment* +> +> *multiline-comment-text-item* → *comment-text-item* +> +> *multiline-comment-text-item* → Any Unicode scalar value except **`/*`** または **`*/`** + +> Grammar of an identifier: +> +> *identifier* → *identifier-head* *identifier-characters*_?_ +> +> *identifier* → **`` ` ``** *identifier-head* *identifier-characters*_?_ **`` ` ``** +> +> *identifier* → *implicit-parameter-name* +> +> *identifier* → *property-wrapper-projection* +> +> *identifier-list* → *identifier* | *identifier* **`,`** *identifier-list* +> +> +> +> *identifier-head* → 大文字または小文字の A ~ Z +> +> *identifier-head* → **`_`** +> +> *identifier-head* → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, または U+00B7–U+00BA +> +> *identifier-head* → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, または U+00F8–U+00FF +> +> *identifier-head* → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, または U+180F–U+1DBF +> +> *identifier-head* → U+1E00–U+1FFF +> +> *identifier-head* → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, または U+2060–U+206F +> +> *identifier-head* → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, または U+2776–U+2793 +> +> *identifier-head* → U+2C00–U+2DFF または U+2E80–U+2FFF +> +> *identifier-head* → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, または U+3040–U+D7FF +> +> *identifier-head* → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, または U+FE30–U+FE44 +> +> *identifier-head* → U+FE47–U+FFFD +> +> *identifier-head* → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, または U+40000–U+4FFFD +> +> *identifier-head* → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, または U+80000–U+8FFFD +> +> *identifier-head* → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, または U+C0000–U+CFFFD +> +> *identifier-head* → U+D0000–U+DFFFD または U+E0000–U+EFFFD +> +> +> +> *identifier-character* → 数値 0 ~ 9 +> +> *identifier-character* → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, または U+FE20–U+FE2F +> +> *identifier-character* → *identifier-head* +> +> *identifier-characters* → *identifier-character* *identifier-characters*_?_ +> +> +> +> *implicit-parameter-name* → **`$`** *decimal-digits* +> +> *property-wrapper-projection* → **`$`** *identifier-characters* + +> Grammar of a literal: +> +> *literal* → *numeric-literal* | *string-literal* | *regular-expression-literal* | *boolean-literal* | *nil-literal* +> +> +> +> *numeric-literal* → **`-`**_?_ *integer-literal* | **`-`**_?_ *floating-point-literal* +> +> *boolean-literal* → **`true`** | **`false`** +> +> *nil-literal* → **`nil`** + +> Grammar of an integer literal: +> +> *integer-literal* → *binary-literal* +> +> *integer-literal* → *octal-literal* +> +> *integer-literal* → *decimal-literal* +> +> *integer-literal* → *hexadecimal-literal* +> +> +> +> *binary-literal* → **`0b`** *binary-digit* *binary-literal-characters*_?_ +> +> *binary-digit* → 数値 0 または 1 +> +> *binary-literal-character* → *binary-digit* | **`_`** +> +> *binary-literal-characters* → *binary-literal-character* *binary-literal-characters*_?_ +> +> +> +> *octal-literal* → **`0o`** *octal-digit* *octal-literal-characters*_?_ +> +> *octal-digit* → 数値 0 ~ 7 +> +> *octal-literal-character* → *octal-digit* | **`_`** +> +> *octal-literal-characters* → *octal-literal-character* *octal-literal-characters*_?_ +> +> +> +> *decimal-literal* → *decimal-digit* *decimal-literal-characters*_?_ +> +> *decimal-digit* → 数値 0 ~ 9 +> +> *decimal-digits* → *decimal-digit* *decimal-digits*_?_ +> +> *decimal-literal-character* → *decimal-digit* | **`_`** +> +> *decimal-literal-characters* → *decimal-literal-character* *decimal-literal-characters*_?_ +> +> +> +> *hexadecimal-literal* → **`0x`** *hexadecimal-digit* *hexadecimal-literal-characters*_?_ +> +> *hexadecimal-digit* → 数値 0 ~ 9, a ~ f、または A ~ F +> +> *hexadecimal-literal-character* → *hexadecimal-digit* | **`_`** +> +> *hexadecimal-literal-characters* → *hexadecimal-literal-character* *hexadecimal-literal-characters*_?_ + +> Grammar of a floating-point literal: +> +> *floating-point-literal* → *decimal-literal* *decimal-fraction*_?_ *decimal-exponent*_?_ +> +> *floating-point-literal* → *hexadecimal-literal* *hexadecimal-fraction*_?_ *hexadecimal-exponent* +> +> +> +> *decimal-fraction* → **`.`** *decimal-literal* +> +> *decimal-exponent* → *floating-point-e* *sign*_?_ *decimal-literal* +> +> +> +> *hexadecimal-fraction* → **`.`** *hexadecimal-digit* *hexadecimal-literal-characters*_?_ +> +> *hexadecimal-exponent* → *floating-point-p* *sign*_?_ *decimal-literal* +> +> +> +> *floating-point-e* → **`e`** | **`E`** +> +> *floating-point-p* → **`p`** | **`P`** +> +> *sign* → **`+`** | **`-`** + +> Grammar of a string literal: +> +> *string-literal* → *static-string-literal* | *interpolated-string-literal* +> +> +> +> *string-literal-opening-delimiter* → *extended-string-literal-delimiter*_?_ **`"`** +> +> *string-literal-closing-delimiter* → **`"`** *extended-string-literal-delimiter*_?_ +> +> +> +> *static-string-literal* → *string-literal-opening-delimiter* *quoted-text*_?_ *string-literal-closing-delimiter* +> +> *static-string-literal* → *multiline-string-literal-opening-delimiter* *multiline-quoted-text*_?_ *multiline-string-literal-closing-delimiter* +> +> +> +> *multiline-string-literal-opening-delimiter* → *extended-string-literal-delimiter*_?_ **`"""`** +> +> *multiline-string-literal-closing-delimiter* → **`"""`** *extended-string-literal-delimiter*_?_ +> +> *extended-string-literal-delimiter* → **`#`** *extended-string-literal-delimiter*_?_ +> +> +> +> *quoted-text* → *quoted-text-item* *quoted-text*_?_ +> +> *quoted-text-item* → *escaped-character* +> +> *quoted-text-item* → **`"`**, **`\`**, U+000A、または U+000D を除く任意のUnicodeスカラ値 +> +> +> +> *multiline-quoted-text* → *multiline-quoted-text-item* *multiline-quoted-text*_?_ +> +> *multiline-quoted-text-item* → *escaped-character* +> +> *multiline-quoted-text-item* → **`\`** を除く任意のUnicodeスカラ値 +> +> *multiline-quoted-text-item* → *escaped-newline* +> +> +> +> *interpolated-string-literal* → *string-literal-opening-delimiter* *interpolated-text*_?_ *string-literal-closing-delimiter* +> +> *interpolated-string-literal* → *multiline-string-literal-opening-delimiter* *multiline-interpolated-text*_?_ *multiline-string-literal-closing-delimiter* +> +> +> +> *interpolated-text* → *interpolated-text-item* *interpolated-text*_?_ +> +> *interpolated-text-item* → **`\(`** *expression* **`)`** | *quoted-text-item* +> +> +> +> *multiline-interpolated-text* → *multiline-interpolated-text-item* *multiline-interpolated-text*_?_ +> +> *multiline-interpolated-text-item* → **`\(`** *expression* **`)`** | *multiline-quoted-text-item* +> +> +> +> *escape-sequence* → **`\`** *extended-string-literal-delimiter* +> +> *escaped-character* → *escape-sequence* **`0`** | *escape-sequence* **`\`** | *escape-sequence* **`t`** | *escape-sequence* **`n`** | *escape-sequence* **`r`** | *escape-sequence* **`"`** | *escape-sequence* **`'`** +> +> *escaped-character* → *escape-sequence* **`u`** **`{`** *unicode-scalar-digits* **`}`** +> +> *unicode-scalar-digits* → Between one and eight hexadecimal digits +> +> +> +> *escaped-newline* → *escape-sequence* *inline-spaces*_?_ *line-break* + +> Grammar of a regular expression literal: +> +> *regular-expression-literal* → *regular-expression-literal-opening-delimiter* *regular-expression* *regular-expression-literal-closing-delimiter* +> +> *regular-expression* → Any regular expression +> +> +> +> *regular-expression-literal-opening-delimiter* → *extended-regular-expression-literal-delimiter*_?_ **`/`** +> +> *regular-expression-literal-closing-delimiter* → **`/`** *extended-regular-expression-literal-delimiter*_?_ +> +> +> +> *extended-regular-expression-literal-delimiter* → **`#`** *extended-regular-expression-literal-delimiter*_?_ + +> Grammar of operators: +> +> *operator* → *operator-head* *operator-characters*_?_ +> +> *operator* → *dot-operator-head* *dot-operator-characters* +> +> +> +> *operator-head* → **`/`** | **`=`** | **`-`** | **`+`** | **`!`** | **`*`** | **`%`** | **`<`** | **`>`** | **`&`** | **`|`** | **`^`** | **`~`** | **`?`** +> +> *operator-head* → U+00A1–U+00A7 +> +> *operator-head* → U+00A9 または U+00AB +> +> *operator-head* → U+00AC または U+00AE +> +> *operator-head* → U+00B0–U+00B1 +> +> *operator-head* → U+00B6, U+00BB, U+00BF, U+00D7, または U+00F7 +> +> *operator-head* → U+2016–U+2017 +> +> *operator-head* → U+2020–U+2027 +> +> *operator-head* → U+2030–U+203E +> +> *operator-head* → U+2041–U+2053 +> +> *operator-head* → U+2055–U+205E +> +> *operator-head* → U+2190–U+23FF +> +> *operator-head* → U+2500–U+2775 +> +> *operator-head* → U+2794–U+2BFF +> +> *operator-head* → U+2E00–U+2E7F +> +> *operator-head* → U+3001–U+3003 +> +> *operator-head* → U+3008–U+3020 +> +> *operator-head* → U+3030 +> +> +> +> *operator-character* → *operator-head* +> +> *operator-character* → U+0300–U+036F +> +> *operator-character* → U+1DC0–U+1DFF +> +> *operator-character* → U+20D0–U+20FF +> +> *operator-character* → U+FE00–U+FE0F +> +> *operator-character* → U+FE20–U+FE2F +> +> *operator-character* → U+E0100–U+E01EF +> +> *operator-characters* → *operator-character* *operator-characters*_?_ +> +> +> +> *dot-operator-head* → **`.`** +> +> *dot-operator-character* → **`.`** | *operator-character* +> +> *dot-operator-characters* → *dot-operator-character* *dot-operator-characters*_?_ +> +> +> +> *infix-operator* → *operator* +> +> *prefix-operator* → *operator* +> +> *postfix-operator* → *operator* + +## Types\(型\) + +> Grammar of a type: +> +> *type* → *function-type* +> +> *type* → *array-type* +> +> *type* → *dictionary-type* +> +> *type* → *type-identifier* +> +> *type* → *tuple-type* +> +> *type* → *optional-type* +> +> *type* → *implicitly-unwrapped-optional-type* +> +> *type* → *protocol-composition-type* +> +> *type* → *opaque-type* +> +> *type* → *metatype-type* +> +> *type* → *any-type* +> +> *type* → *self-type* +> +> *type* → **`(`** *type* **`)`** + +> Grammar of a type annotation: +> +> *type-annotation* → **`:`** *attributes*_?_ **`inout`**_?_ *type* + +> Grammar of a type identifier: +> +> *type-identifier* → *type-name* *generic-argument-clause*_?_ | *type-name* *generic-argument-clause*_?_ **`.`** *type-identifier* +> +> *type-name* → *identifier* + +> Grammar of a tuple type: +> +> *tuple-type* → **`(`** **`)`** | **`(`** *tuple-type-element* **`,`** *tuple-type-element-list* **`)`** +> +> *tuple-type-element-list* → *tuple-type-element* | *tuple-type-element* **`,`** *tuple-type-element-list* +> +> *tuple-type-element* → *element-name* *type-annotation* | *type* +> +> *element-name* → *identifier* + +> Grammar of a function type: +> +> *function-type* → *attributes*_?_ *function-type-argument-clause* **`async`**_?_ **`throws`**_?_ **`->`** *type* +> +> +> +> *function-type-argument-clause* → **`(`** **`)`** +> +> *function-type-argument-clause* → **`(`** *function-type-argument-list* **`...`**_?_ **`)`** +> +> +> +> *function-type-argument-list* → *function-type-argument* | *function-type-argument* **`,`** *function-type-argument-list* +> +> *function-type-argument* → *attributes*_?_ **`inout`**_?_ *type* | *argument-label* *type-annotation* +> +> *argument-label* → *identifier* + +> Grammar of an array type: +> +> *array-type* → **`[`** *type* **`]`** + +> Grammar of a dictionary type: +> +> *dictionary-type* → **`[`** *type* **`:`** *type* **`]`** + +> Grammar of an optional type: +> +> *optional-type* → *type* **`?`** + +> Grammar of an implicitly unwrapped optional type: +> +> *implicitly-unwrapped-optional-type* → *type* **`!`** + +> Grammar of a protocol composition type: +> +> *protocol-composition-type* → *type-identifier* **`&`** *protocol-composition-continuation* +> +> *protocol-composition-continuation* → *type-identifier* | *protocol-composition-type* + +> Grammar of an opaque type: +> +> *opaque-type* → **`some`** *type* + +> Grammar of a boxed protocol type: +> +> *boxed-protocol-type* → **`any`** *type* + +> Grammar of a metatype type: +> +> *metatype-type* → *type* **`.`** **`Type`** | *type* **`.`** **`Protocol`** + +> Grammar of an Any type: +> +> *any-type* → **`Any`** + +> Grammar of a Self type: +> +> *self-type* → **`Self`** + +> Grammar of a type inheritance clause: +> +> *type-inheritance-clause* → **`:`** *type-inheritance-list* +> +> *type-inheritance-list* → *attributes*_?_ *type-identifier* | *attributes*_?_ *type-identifier* **`,`** *type-inheritance-list* + +## Expressions\(式\) + +> Grammar of an expression: +> +> *expression* → *try-operator*_?_ *await-operator*_?_ *prefix-expression* *infix-expressions*_?_ +> +> *expression-list* → *expression* | *expression* **`,`** *expression-list* + +> Grammar of a prefix expression: +> +> *prefix-expression* → *prefix-operator*_?_ *postfix-expression* +> +> *prefix-expression* → *in-out-expression* + +> Grammar of an in-out expression: +> +> *in-out-expression* → **`&`** *identifier* + +> Grammar of a try expression: +> +> *try-operator* → **`try`** | **`try`** **`?`** | **`try`** **`!`** + +> Grammar of an await expression: +> +> *await-operator* → **`await`** + +> Grammar of an infix expression: +> +> *infix-expression* → *infix-operator* *prefix-expression* +> +> *infix-expression* → *assignment-operator* *try-operator*_?_ *prefix-expression* +> +> *infix-expression* → *conditional-operator* *try-operator*_?_ *prefix-expression* +> +> *infix-expression* → *type-casting-operator* +> +> *infix-expressions* → *infix-expression* *infix-expressions*_?_ + +> Grammar of an assignment operator: +> +> *assignment-operator* → **`=`** + +> Grammar of a conditional operator: +> +> *conditional-operator* → **`?`** *expression* **`:`** + +> Grammar of a type-casting operator: +> +> *type-casting-operator* → **`is`** *type* +> +> *type-casting-operator* → **`as`** *type* +> +> *type-casting-operator* → **`as`** **`?`** *type* +> +> *type-casting-operator* → **`as`** **`!`** *type* + +> Grammar of a primary expression: +> +> *primary-expression* → *identifier* *generic-argument-clause*_?_ +> +> *primary-expression* → *literal-expression* +> +> *primary-expression* → *self-expression* +> +> *primary-expression* → *superclass-expression* +> +> *primary-expression* → *conditional-expression* +> +> *primary-expression* → *closure-expression* +> +> *primary-expression* → *parenthesized-expression* +> +> *primary-expression* → *tuple-expression* +> +> *primary-expression* → *implicit-member-expression* +> +> *primary-expression* → *wildcard-expression* +> +> *primary-expression* → *key-path-expression* +> +> *primary-expression* → *selector-expression* +> +> *primary-expression* → *key-path-string-expression* + +> Grammar of a literal expression: +> +> *literal-expression* → *literal* +> +> *literal-expression* → *array-literal* | *dictionary-literal* | *playground-literal* +> +> *literal-expression* → **`#file`** | **`#fileID`** | **`#filePath`** +> +> *literal-expression* → **`#line`** | **`#column`** | **`#function`** | **`#dsohandle`** +> +> +> +> *array-literal* → **`[`** *array-literal-items*_?_ **`]`** +> +> *array-literal-items* → *array-literal-item* **`,`**_?_ | *array-literal-item* **`,`** *array-literal-items* +> +> *array-literal-item* → *expression* +> +> +> +> *dictionary-literal* → **`[`** *dictionary-literal-items* **`]`** | **`[`** **`:`** **`]`** +> +> *dictionary-literal-items* → *dictionary-literal-item* **`,`**_?_ | *dictionary-literal-item* **`,`** *dictionary-literal-items* +> +> *dictionary-literal-item* → *expression* **`:`** *expression* +> +> +> +> *playground-literal* → **`#colorLiteral`** **`(`** **`red`** **`:`** *expression* **`,`** **`green`** **`:`** *expression* **`,`** **`blue`** **`:`** *expression* **`,`** **`alpha`** **`:`** *expression* **`)`** +> +> *playground-literal* → **`#fileLiteral`** **`(`** **`resourceName`** **`:`** *expression* **`)`** +> +> *playground-literal* → **`#imageLiteral`** **`(`** **`resourceName`** **`:`** *expression* **`)`** + +> Grammar of a self expression: +> +> *self-expression* → **`self`** | *self-method-expression* | *self-subscript-expression* | *self-initializer-expression* +> +> +> +> *self-method-expression* → **`self`** **`.`** *identifier* +> +> *self-subscript-expression* → **`self`** **`[`** *function-call-argument-list* **`]`** +> +> *self-initializer-expression* → **`self`** **`.`** **`init`** + +> Grammar of a superclass expression: +> +> *superclass-expression* → *superclass-method-expression* | *superclass-subscript-expression* | *superclass-initializer-expression* +> +> +> +> *superclass-method-expression* → **`super`** **`.`** *identifier* +> +> *superclass-subscript-expression* → **`super`** **`[`** *function-call-argument-list* **`]`** +> +> *superclass-initializer-expression* → **`super`** **`.`** **`init`** + +> Grammar of a conditional expression: +> +> *conditional-expression* → *if-expression* | *switch-expression* +> +> +> +> *if-expression* → **`if`** *condition-list* **`{`** *statement* **`}`** *if-expression-tail* +> +> *if-expression-tail* → **`else`** *if-expression* +> +> *if-expression-tail* → **`else`** **`{`** *statement* **`}`** *if-expression-tail* +> +> +> +> *switch-expression* → **`switch`** *expression* **`{`** *switch-expression-cases* **`}`** +> +> *switch-expression-cases* → *switch-expression-case* *switch-expression-cases*_?_ +> +> *switch-expression-case* → *case-label* *statement* +> +> *switch-expression-case* → *default-label* *statement* + +> Grammar of a closure expression: +> +> *closure-expression* → **`{`** *attributes*_?_ *closure-signature*_?_ *statements*_?_ **`}`** +> +> +> +> *closure-signature* → *capture-list*_?_ *closure-parameter-clause* **`async`**_?_ **`throws`**_?_ *function-result*_?_ **`in`** +> +> *closure-signature* → *capture-list* **`in`** +> +> +> +> *closure-parameter-clause* → **`(`** **`)`** | **`(`** *closure-parameter-list* **`)`** | *identifier-list* +> +> *closure-parameter-list* → *closure-parameter* | *closure-parameter* **`,`** *closure-parameter-list* +> +> *closure-parameter* → *closure-parameter-name* *type-annotation*_?_ +> +> *closure-parameter* → *closure-parameter-name* *type-annotation* **`...`** +> +> *closure-parameter-name* → *identifier* +> +> +> +> *capture-list* → **`[`** *capture-list-items* **`]`** +> +> *capture-list-items* → *capture-list-item* | *capture-list-item* **`,`** *capture-list-items* +> +> *capture-list-item* → *capture-specifier*_?_ *identifier* +> +> *capture-list-item* → *capture-specifier*_?_ *identifier* **`=`** *expression* +> +> *capture-list-item* → *capture-specifier*_?_ *self-expression* +> +> *capture-specifier* → **`weak`** | **`unowned`** | **`unowned(safe)`** | **`unowned(unsafe)`** + +> Grammar of a implicit member expression: +> +> *implicit-member-expression* → **`.`** *identifier* +> +> *implicit-member-expression* → **`.`** *identifier* **`.`** *postfix-expression* + +> Grammar of a parenthesized expression: +> +> *parenthesized-expression* → **`(`** *expression* **`)`** + +> Grammar of a tuple expression: +> +> *tuple-expression* → **`(`** **`)`** | **`(`** *tuple-element* **`,`** *tuple-element-list* **`)`** +> +> *tuple-element-list* → *tuple-element* | *tuple-element* **`,`** *tuple-element-list* +> +> *tuple-element* → *expression* | *identifier* **`:`** *expression* + +> Grammar of a wildcard expression: +> +> *wildcard-expression* → **`_`** + +> Grammar of a key-path expression: +> +> *key-path-expression* → **`\`** *type*_?_ **`.`** *key-path-components* +> +> *key-path-components* → *key-path-component* | *key-path-component* **`.`** *key-path-components* +> +> *key-path-component* → *identifier* *key-path-postfixes*_?_ | *key-path-postfixes* +> +> +> +> *key-path-postfixes* → *key-path-postfix* *key-path-postfixes*_?_ +> +> *key-path-postfix* → **`?`** | **`!`** | **`self`** | **`[`** *function-call-argument-list* **`]`** + +> Grammar of a selector expression: +> +> *selector-expression* → **`#selector`** **`(`** *expression* **`)`** +> +> *selector-expression* → **`#selector`** **`(`** **`getter:`** *expression* **`)`** +> +> *selector-expression* → **`#selector`** **`(`** **`setter:`** *expression* **`)`** + +> Grammar of a key-path string expression: +> +> *key-path-string-expression* → **`#keyPath`** **`(`** *expression* **`)`** + +> Grammar of a postfix expression: +> +> *postfix-expression* → *primary-expression* +> +> *postfix-expression* → *postfix-expression* *postfix-operator* +> +> *postfix-expression* → *function-call-expression* +> +> *postfix-expression* → *initializer-expression* +> +> *postfix-expression* → *explicit-member-expression* +> +> *postfix-expression* → *postfix-self-expression* +> +> *postfix-expression* → *subscript-expression* +> +> *postfix-expression* → *forced-value-expression* +> +> *postfix-expression* → *optional-chaining-expression* + +> Grammar of a function call expression: +> +> *function-call-expression* → *postfix-expression* *function-call-argument-clause* +> +> *function-call-expression* → *postfix-expression* *function-call-argument-clause*_?_ *trailing-closures* +> +> +> +> *function-call-argument-clause* → **`(`** **`)`** | **`(`** *function-call-argument-list* **`)`** +> +> *function-call-argument-list* → *function-call-argument* | *function-call-argument* **`,`** *function-call-argument-list* +> +> *function-call-argument* → *expression* | *identifier* **`:`** *expression* +> +> *function-call-argument* → *operator* | *identifier* **`:`** *operator* +> +> +> +> *trailing-closures* → *closure-expression* *labeled-trailing-closures*_?_ +> +> *labeled-trailing-closures* → *labeled-trailing-closure* *labeled-trailing-closures*_?_ +> +> *labeled-trailing-closure* → *identifier* **`:`** *closure-expression* + +> Grammar of an initializer expression: +> +> *initializer-expression* → *postfix-expression* **`.`** **`init`** +> +> *initializer-expression* → *postfix-expression* **`.`** **`init`** **`(`** *argument-names* **`)`** + +> Grammar of an explicit member expression: +> +> *explicit-member-expression* → *postfix-expression* **`.`** *decimal-digits* +> +> *explicit-member-expression* → *postfix-expression* **`.`** *identifier* *generic-argument-clause*_?_ +> +> *explicit-member-expression* → *postfix-expression* **`.`** *identifier* **`(`** *argument-names* **`)`** +> +> *explicit-member-expression* → *postfix-expression* *conditional-compilation-block* +> +> +> +> *argument-names* → *argument-name* *argument-names*_?_ +> +> *argument-name* → *identifier* **`:`** + +> Grammar of a postfix self expression: +> +> *postfix-self-expression* → *postfix-expression* **`.`** **`self`** + +> Grammar of a subscript expression: +> +> *subscript-expression* → *postfix-expression* **`[`** *function-call-argument-list* **`]`** + +> Grammar of a forced-value expression: +> +> *forced-value-expression* → *postfix-expression* **`!`** + +> Grammar of an optional-chaining expression: +> +> *optional-chaining-expression* → *postfix-expression* **`?`** + +## Statements\(文\) + +> Grammar of a statement: +> +> *statement* → *expression* **`;`**_?_ +> +> *statement* → *declaration* **`;`**_?_ +> +> *statement* → *loop-statement* **`;`**_?_ +> +> *statement* → *branch-statement* **`;`**_?_ +> +> *statement* → *labeled-statement* **`;`**_?_ +> +> *statement* → *control-transfer-statement* **`;`**_?_ +> +> *statement* → *defer-statement* **`;`**_?_ +> +> *statement* → *do-statement* **`;`**_?_ +> +> *statement* → *compiler-control-statement* +> +> *statements* → *statement* *statements*_?_ + +> Grammar of a loop statement: +> +> *loop-statement* → *for-in-statement* +> +> *loop-statement* → *while-statement* +> +> *loop-statement* → *repeat-while-statement* + +> Grammar of a for-in statement: +> +> *for-in-statement* → **`for`** **`case`**_?_ *pattern* **`in`** *expression* *where-clause*_?_ *code-block* + +> Grammar of a while statement: +> +> *while-statement* → **`while`** *condition-list* *code-block* +> +> +> +> *condition-list* → *condition* | *condition* **`,`** *condition-list* +> +> *condition* → *expression* | *availability-condition* | *case-condition* | *optional-binding-condition* +> +> +> +> *case-condition* → **`case`** *pattern* *initializer* +> +> *optional-binding-condition* → **`let`** *pattern* *initializer*_?_ | **`var`** *pattern* *initializer*_?_ + +> Grammar of a repeat-while statement: +> +> *repeat-while-statement* → **`repeat`** *code-block* **`while`** *expression* + +> Grammar of a branch statement: +> +> *branch-statement* → *if-statement* +> +> *branch-statement* → *guard-statement* +> +> *branch-statement* → *switch-statement* + +> Grammar of an if statement: +> +> *if-statement* → **`if`** *condition-list* *code-block* *else-clause*_?_ +> +> *else-clause* → **`else`** *code-block* | **`else`** *if-statement* + +> Grammar of a guard statement: +> +> *guard-statement* → **`guard`** *condition-list* **`else`** *code-block* + +> Grammar of a switch statement: +> +> *switch-statement* → **`switch`** *expression* **`{`** *switch-cases*_?_ **`}`** +> +> *switch-cases* → *switch-case* *switch-cases*_?_ +> +> *switch-case* → *case-label* *statements* +> +> *switch-case* → *default-label* *statements* +> +> *switch-case* → *conditional-switch-case* +> +> +> +> *case-label* → *attributes*_?_ **`case`** *case-item-list* **`:`** +> +> *case-item-list* → *pattern* *where-clause*_?_ | *pattern* *where-clause*_?_ **`,`** *case-item-list* +> +> *default-label* → *attributes*_?_ **`default`** **`:`** +> +> +> +> *where-clause* → **`where`** *where-expression* +> +> *where-expression* → *expression* +> +> +> +> *conditional-switch-case* → *switch-if-directive-clause* *switch-elseif-directive-clauses*_?_ *switch-else-directive-clause*_?_ *endif-directive* +> +> *switch-if-directive-clause* → *if-directive* *compilation-condition* *switch-cases*_?_ +> +> *switch-elseif-directive-clauses* → *elseif-directive-clause* *switch-elseif-directive-clauses*_?_ +> +> *switch-elseif-directive-clause* → *elseif-directive* *compilation-condition* *switch-cases*_?_ +> +> *switch-else-directive-clause* → *else-directive* *switch-cases*_?_ + +> Grammar of a labeled statement: +> +> *labeled-statement* → *statement-label* *loop-statement* +> +> *labeled-statement* → *statement-label* *if-statement* +> +> *labeled-statement* → *statement-label* *switch-statement* +> +> *labeled-statement* → *statement-label* *do-statement* +> +> +> +> *statement-label* → *label-name* **`:`** +> +> *label-name* → *identifier* + +> Grammar of a control transfer statement: +> +> *control-transfer-statement* → *break-statement* +> +> *control-transfer-statement* → *continue-statement* +> +> *control-transfer-statement* → *fallthrough-statement* +> +> *control-transfer-statement* → *return-statement* +> +> *control-transfer-statement* → *throw-statement* + +> Grammar of a break statement: +> +> *break-statement* → **`break`** *label-name*_?_ + +> Grammar of a continue statement: +> +> *continue-statement* → **`continue`** *label-name*_?_ + +> Grammar of a fallthrough statement: +> +> *fallthrough-statement* → **`fallthrough`** + +> Grammar of a return statement: +> +> *return-statement* → **`return`** *expression*_?_ + +> Grammar of a throw statement: +> +> *throw-statement* → **`throw`** *expression* + +> Grammar of a defer statement: +> +> *defer-statement* → **`defer`** *code-block* + +> Grammar of a do statement: +> +> *do-statement* → **`do`** *code-block* *catch-clauses*_?_ +> +> *catch-clauses* → *catch-clause* *catch-clauses*_?_ +> +> *catch-clause* → **`catch`** *catch-pattern-list*_?_ *code-block* +> +> *catch-pattern-list* → *catch-pattern* | *catch-pattern* **`,`** *catch-pattern-list* +> +> *catch-pattern* → *pattern* *where-clause*_?_ + +> Grammar of a compiler control statement: +> +> *compiler-control-statement* → *conditional-compilation-block* +> +> *compiler-control-statement* → *line-control-statement* +> +> *compiler-control-statement* → *diagnostic-statement* + +> Grammar of a conditional compilation block: +> +> *conditional-compilation-block* → *if-directive-clause* *elseif-directive-clauses*_?_ *else-directive-clause*_?_ *endif-directive* +> +> +> +> *if-directive-clause* → *if-directive* *compilation-condition* *statements*_?_ +> +> *elseif-directive-clauses* → *elseif-directive-clause* *elseif-directive-clauses*_?_ +> +> *elseif-directive-clause* → *elseif-directive* *compilation-condition* *statements*_?_ +> +> *else-directive-clause* → *else-directive* *statements*_?_ +> +> *if-directive* → **`#if`** +> +> *elseif-directive* → **`#elseif`** +> +> *else-directive* → **`#else`** +> +> *endif-directive* → **`#endif`** +> +> +> +> *compilation-condition* → *platform-condition* +> +> *compilation-condition* → *identifier* +> +> *compilation-condition* → *boolean-literal* +> +> *compilation-condition* → **`(`** *compilation-condition* **`)`** +> +> *compilation-condition* → **`!`** *compilation-condition* +> +> *compilation-condition* → *compilation-condition* **`&&`** *compilation-condition* +> +> *compilation-condition* → *compilation-condition* **`||`** *compilation-condition* +> +> +> +> *platform-condition* → **`os`** **`(`** *operating-system* **`)`** +> +> *platform-condition* → **`arch`** **`(`** *architecture* **`)`** +> +> *platform-condition* → **`swift`** **`(`** **`>=`** *swift-version* **`)`** | **`swift`** **`(`** **`<`** *swift-version* **`)`** +> +> *platform-condition* → **`compiler`** **`(`** **`>=`** *swift-version* **`)`** | **`compiler`** **`(`** **`<`** *swift-version* **`)`** +> +> *platform-condition* → **`canImport`** **`(`** *import-path* **`)`** +> +> *platform-condition* → **`targetEnvironment`** **`(`** *environment* **`)`** +> +> +> +> *operating-system* → **`macOS`** | **`iOS`** | **`watchOS`** | **`tvOS`** | **`Linux`** | **`Windows`** +> +> *architecture* → **`i386`** | **`x86_64`** | **`arm`** | **`arm64`** +> +> *swift-version* → *decimal-digits* *swift-version-continuation*_?_ +> +> *swift-version-continuation* → **`.`** *decimal-digits* *swift-version-continuation*_?_ +> +> *environment* → **`simulator`** | **`macCatalyst`** + +> Grammar of a line control statement: +> +> *line-control-statement* → **`#sourceLocation`** **`(`** **`file:`** *file-path* **`,`** **`line:`** *line-number* **`)`** +> +> *line-control-statement* → **`#sourceLocation`** **`(`** **`)`** +> +> *line-number* → A decimal integer greater than zero +> +> *file-path* → *static-string-literal* + +> Grammar of a compile-time diagnostic statement: +> +> *diagnostic-statement* → **`#error`** **`(`** *diagnostic-message* **`)`** +> +> *diagnostic-statement* → **`#warning`** **`(`** *diagnostic-message* **`)`** +> +> +> +> *diagnostic-message* → *static-string-literal* + +> Grammar of an availability condition: +> +> *availability-condition* → **`#available`** **`(`** *availability-arguments* **`)`** +> +> *availability-condition* → **`#unavailable`** **`(`** *availability-arguments* **`)`** +> +> *availability-arguments* → *availability-argument* | *availability-argument* **`,`** *availability-arguments* +> +> *availability-argument* → *platform-name* *platform-version* +> +> *availability-argument* → **`*`** +> +> +> +> *platform-name* → **`iOS`** | **`iOSApplicationExtension`** +> +> *platform-name* → **`macOS`** | **`macOSApplicationExtension`** +> +> *platform-name* → **`macCatalyst`** | **`macCatalystApplicationExtension`** +> +> *platform-name* → **`watchOS`** | **`watchOSApplicationExtension`** +> +> *platform-name* → **`tvOS`** | **`tvOSApplicationExtension`** +> +> *platform-version* → *decimal-digits* +> +> *platform-version* → *decimal-digits* **`.`** *decimal-digits* +> +> *platform-version* → *decimal-digits* **`.`** *decimal-digits* **`.`** *decimal-digits* + +## DeclarDeclarations\(宣言\)ations + +> Grammar of a declaration: +> +> *declaration* → *import-declaration* +> +> *declaration* → *constant-declaration* +> +> *declaration* → *variable-declaration* +> +> *declaration* → *typealias-declaration* +> +> *declaration* → *function-declaration* +> +> *declaration* → *enum-declaration* +> +> *declaration* → *struct-declaration* +> +> *declaration* → *class-declaration* +> +> *declaration* → *actor-declaration* +> +> *declaration* → *protocol-declaration* +> +> *declaration* → *initializer-declaration* +> +> *declaration* → *deinitializer-declaration* +> +> *declaration* → *extension-declaration* +> +> *declaration* → *subscript-declaration* +> +> *declaration* → *operator-declaration* +> +> *declaration* → *precedence-group-declaration* +> +> *declarations* → *declaration* *declarations*_?_ + +> Grammar of a top-level declaration: +> +> *top-level-declaration* → *statements*_?_ + +> Grammar of a code block: +> +> *code-block* → **`{`** *statements*_?_ **`}`** + +> Grammar of an import declaration: +> +> *import-declaration* → *attributes*_?_ **`import`** *import-kind*_?_ *import-path* +> +> +> +> *import-kind* → **`typealias`** | **`struct`** | **`class`** | **`enum`** | **`protocol`** | **`let`** | **`var`** | **`func`** +> +> *import-path* → *identifier* | *identifier* **`.`** *import-path* -## Types\(型\) +> Grammar of a constant declaration: +> +> *constant-declaration* → *attributes*_?_ *declaration-modifiers*_?_ **`let`** *pattern-initializer-list* +> +> +> +> *pattern-initializer-list* → *pattern-initializer* | *pattern-initializer* **`,`** *pattern-initializer-list* +> +> *pattern-initializer* → *pattern* *initializer*_?_ +> +> *initializer* → **`=`** *expression* -> GRAMMAR OF A TYPE -> type → [function-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type) -> type → [array-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_array-type) -> type → [dictionary-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_dictionary-type) -> type → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) -> type → [tuple-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type) -> type → [optional-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_optional-type) -> type → [implicitly-unwrapped-optional-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_implicitly-unwrapped-optional-type) -> type → [protocol-composition-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_protocol-composition-type) -> type → [opaque-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_opaque-type) -> type → [metatype-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_metatype-type) -> type → [any-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_any-type) -> type → [self-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_self-type) -> type → `(` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `)` - -> GRAMMAR OF A TYPE ANNOTATION -> type-annotation → `:` [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt **inout**opt [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) - -> GRAMMAR OF A TYPE IDENTIFIER -> type-identifier → [type-name](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-name) [generic-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument-clause)opt \| [type-name](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-name) [generic-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument-clause)opt `.` [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) -> type-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) - -> GRAMMAR OF A TUPLE TYPE -> tuple-type → `(` `)` \| `(` [tuple-type-element](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element) `,` [tuple-type-element-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element-list) `)` -> tuple-type-element-list → [tuple-type-element](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element) \| [tuple-type-element](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element) `,` [tuple-type-element-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element-list) -> tuple-type-element → [element-name](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_element-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) \| [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> element-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) - -> GRAMMAR OF A FUNCTION TYPE -> function-type → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [function-type-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument-clause) `throws`opt `->` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> function-type-argument-clause → `(` `)` -> function-type-argument-clause → `(` [function-type-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument-list) `...`opt `)` -> function-type-argument-list → [function-type-argument](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument) \| [function-type-argument](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument) `,` [function-type-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument-list) -> function-type-argument → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `inout`opt [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) \| [argument-label](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_argument-label) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) -> argument-label → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) - -> GRAMMAR OF AN ARRAY TYPE -> array-type → `[` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `]` - -> GRAMMAR OF A DICTIONARY TYPE -> dictionary-type → `[` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `:` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `]` - -> GRAMMAR OF AN OPTIONAL TYPE -> optional-type → [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `?` - -> GRAMMAR OF AN IMPLICITLY UNWRAPPED OPTIONAL TYPE -> implicitly-unwrapped-optional-type → [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `!` - -> GRAMMAR OF A PROTOCOL COMPOSITION TYPE -> protocol-composition-type → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) `&` [protocol-composition-continuation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_protocol-composition-continuation) -> protocol-composition-continuation → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) \| [protocol-composition-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_protocol-composition-type) - -> GRAMMAR OF AN OPAQUE TYPE -> opaque-type → `some` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) - -> GRAMMAR OF A METATYPE TYPE -> metatype-type → [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `.` `Type` \| [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `.` `Protocol` - -> GRAMMAR OF AN ANY TYPE -> any-type → `Any` - -> GRAMMAR OF A SELF TYPE -> self-type → `Self` - -> GRAMMAR OF A TYPE INHERITANCE CLAUSE -> type-inheritance-clause → `:` [type-inheritance-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-list) -> type-inheritance-list → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) \| [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) `,` [type-inheritance-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-list) +> Grammar of a variable declaration: +> +> *variable-declaration* → *variable-declaration-head* *pattern-initializer-list* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *code-block* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *getter-setter-block* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *getter-setter-keyword-block* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *initializer* *willSet-didSet-block* +> +> *variable-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *initializer*_?_ *willSet-didSet-block* +> +> +> +> *variable-declaration-head* → *attributes*_?_ *declaration-modifiers*_?_ **`var`** +> +> *variable-name* → *identifier* +> +> +> +> *getter-setter-block* → *code-block* +> +> *getter-setter-block* → **`{`** *getter-clause* *setter-clause*_?_ **`}`** +> +> *getter-setter-block* → **`{`** *setter-clause* *getter-clause* **`}`** +> +> *getter-clause* → *attributes*_?_ *mutation-modifier*_?_ **`get`** *code-block* +> +> *setter-clause* → *attributes*_?_ *mutation-modifier*_?_ **`set`** *setter-name*_?_ *code-block* +> +> *setter-name* → **`(`** *identifier* **`)`** +> +> +> +> *getter-setter-keyword-block* → **`{`** *getter-keyword-clause* *setter-keyword-clause*_?_ **`}`** +> +> *getter-setter-keyword-block* → **`{`** *setter-keyword-clause* *getter-keyword-clause* **`}`** +> +> *getter-keyword-clause* → *attributes*_?_ *mutation-modifier*_?_ **`get`** +> +> *setter-keyword-clause* → *attributes*_?_ *mutation-modifier*_?_ **`set`** +> +> +> +> *willSet-didSet-block* → **`{`** *willSet-clause* *didSet-clause*_?_ **`}`** +> +> *willSet-didSet-block* → **`{`** *didSet-clause* *willSet-clause*_?_ **`}`** +> +> *willSet-clause* → *attributes*_?_ **`willSet`** *setter-name*_?_ *code-block* +> +> *didSet-clause* → *attributes*_?_ **`didSet`** *setter-name*_?_ *code-block* -## Expressions\(式\) +> Grammar of a type alias declaration: +> +> *typealias-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`typealias`** *typealias-name* *generic-parameter-clause*_?_ *typealias-assignment* +> +> *typealias-name* → *identifier* +> +> *typealias-assignment* → **`=`** *type* -> GRAMMAR OF AN EXPRESSION -> expression → [try-operator](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_try-operator)opt [await-operator](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_await-operator)opt [prefix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_prefix-expression) [infix-expressions](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_infix-expressions)opt -> expression-list → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) \| [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `,` [expression-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression-list) - -> GRAMMAR OF A PREFIX EXPRESSION -> prefix-expression → [prefix-operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_prefix-operator)opt [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) -> prefix-expression → [in-out-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_in-out-expression) - -> GRAMMAR OF AN IN-OUT EXPRESSION -> in-out-expression → `&` [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) - -> GRAMMAR OF A TRY EXPRESSION -> try-operator → `try` \| `try` `?` \| `try` `!` - -> GRAMMAR OF AN AWAIT EXPRESSION -> _await-operator_ → `await` - -> GRAMMAR OF A INFIX EXPRESSION -> infix-expression → [infix-operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_infix-operator) [prefix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_prefix-expression) -> infix-expression → [assignment-operator](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_assignment-operator)opt [prefix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_prefix-expression) -> infix-expression → [conditional-operator](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_conditional-operator)opt [prefix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_prefix-expression) -> infix-expression → [type-casting-operator](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_type-casting-operator) -> infix-expressions → [infix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_infix-expression) [infix-expressions](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_infix-expressions)opt - -> GRAMMAR OF AN ASSIGNMENT OPERATOR -> assignment-operator → `=` - -> GRAMMAR OF A CONDITIONAL OPERATOR -> conditional-operator → `?` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `:` - -> GRAMMAR OF A TYPE-CASTING OPERATOR -> type-casting-operator → `is` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> type-casting-operator → `as` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> type-casting-operator → `as` `?` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> type-casting-operator → `as` `!` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) - -> GRAMMAR OF A PRIMARY EXPRESSION -> primary-expression → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) [generic-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument-clause)opt -> primary-expression → [literal-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_literal-expression) -> primary-expression → [self-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_self-expression) -> primary-expression → [superclass-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_superclass-expression) -> *primary-expression* → *conditional-expression* -> primary-expression → [closure-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-expression) -> primary-expression → [parenthesized-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_parenthesized-expression) -> primary-expression → [tuple-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_tuple-expression) -> primary-expression → [implicit-member-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_implicit-member-expression) -> primary-expression → [wildcard-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_wildcard-expression) -> primary-expression → [key-path-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-expression) -> primary-expression → [selector-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_selector-expression) -> primary-expression → [key-path-string-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-string-expression) - -> GRAMMAR OF A LITERAL EXPRESSION -> literal-expression → [literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_literal) -> literal-expression → [array-literal](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_array-literal) \| [dictionary-literal](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_dictionary-literal) \| [playground-literal](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_playground-literal) -> literal-expression → `#file` \| `#fileID` \| `#filePath` -> literal-expression → `#line` \| `#column` \| `#function` \| `#dsohandle` -> array-literal → `[` [array-literal-items](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_array-literal-items)opt `]` -> array-literal-items → [array-literal-item](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_array-literal-item) `,`opt \| [array-literal-item](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_array-literal-item) `,` [array-literal-items](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_array-literal-items) -> array-literal-item → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) -> dictionary-literal → `[` [dictionary-literal-items](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_dictionary-literal-items) `]` \| `[` `:` `]` -> dictionary-literal-items → [dictionary-literal-item](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_dictionary-literal-item) `,`opt \| [dictionary-literal-item](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_dictionary-literal-item) `,` [dictionary-literal-items](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_dictionary-literal-items) -> dictionary-literal-item → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) -> playground-literal → `#colorLiteral` `(` `red` `:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `,` `green` `:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `,` `blue` `:`[expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `,` `alpha` `:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` -> playground-literal → `#fileLiteral` `(` `resourceName` `:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` -> playground-literal → `#imageLiteral` `(` `resourceName` `:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` - -> GRAMMAR OF A SELF EXPRESSION -> self-expression → `self` \| [self-method-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_self-method-expression) \| [self-subscript-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_self-subscript-expression) \| [self-initializer-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_self-initializer-expression) -> self-method-expression → `self` `.` [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> self-subscript-expression → `self` `[` [function-call-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-list) `]` -> self-initializer-expression → `self` `.` `init` - -> GRAMMAR OF A SUPERCLASS EXPRESSION -> superclass-expression → [superclass-method-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_superclass-method-expression) \| [superclass-subscript-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_superclass-subscript-expression) \| [superclass-initializer-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_superclass-initializer-expression) -> superclass-method-expression → `super` `.` [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> superclass-subscript-expression → `super` `[` [function-call-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-list) `]` -> superclass-initializer-expression → `super` `.` `init` +> Grammar of a function declaration: +> +> *function-declaration* → *function-head* *function-name* *generic-parameter-clause*_?_ *function-signature* *generic-where-clause*_?_ *function-body*_?_ +> +> +> +> *function-head* → *attributes*_?_ *declaration-modifiers*_?_ **`func`** +> +> *function-name* → *identifier* | *operator* +> +> +> +> *function-signature* → *parameter-clause* **`async`**_?_ **`throws`**_?_ *function-result*_?_ +> +> *function-signature* → *parameter-clause* **`async`**_?_ **`rethrows`** *function-result*_?_ +> +> *function-result* → **`->`** *attributes*_?_ *type* +> +> *function-body* → *code-block* +> +> +> +> *parameter-clause* → **`(`** **`)`** | **`(`** *parameter-list* **`)`** +> +> *parameter-list* → *parameter* | *parameter* **`,`** *parameter-list* +> +> *parameter* → *external-parameter-name*_?_ *local-parameter-name* *type-annotation* *default-argument-clause*_?_ +> +> *parameter* → *external-parameter-name*_?_ *local-parameter-name* *type-annotation* +> +> *parameter* → *external-parameter-name*_?_ *local-parameter-name* *type-annotation* **`...`** +> +> *external-parameter-name* → *identifier* +> +> *local-parameter-name* → *identifier* +> +> *default-argument-clause* → **`=`** *expression* -> Grammar of a conditional expression: +> Grammar of an enumeration declaration: > -> *conditional-expression* → *if-expression* | *switch-expression* +> *enum-declaration* → *attributes*_?_ *access-level-modifier*_?_ *union-style-enum* > +> *enum-declaration* → *attributes*_?_ *access-level-modifier*_?_ *raw-value-style-enum* > > -> *if-expression* → **`if`** *condition-list* **`{`** *statement* **`}`** *if-expression-tail* > -> *if-expression-tail* → **`else`** *if-expression* +> *union-style-enum* → **`indirect`**_?_ **`enum`** *enum-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ **`{`** *union-style-enum-members*_?_ **`}`** > -> *if-expression-tail* → **`else`** **`{`** *statement* **`}`** *if-expression-tail* +> *union-style-enum-members* → *union-style-enum-member* *union-style-enum-members*_?_ > +> *union-style-enum-member* → *declaration* | *union-style-enum-case-clause* | *compiler-control-statement* > +> *union-style-enum-case-clause* → *attributes*_?_ **`indirect`**_?_ **`case`** *union-style-enum-case-list* > -> *switch-expression* → **`switch`** *expression* **`{`** *switch-expression-cases* **`}`** +> *union-style-enum-case-list* → *union-style-enum-case* | *union-style-enum-case* **`,`** *union-style-enum-case-list* > -> *switch-expression-cases* → *switch-expression-case* *switch-expression-cases*_?_ +> *union-style-enum-case* → *enum-case-name* *tuple-type*_?_ > -> *switch-expression-case* → *case-label* *statement* +> *enum-name* → *identifier* > -> *switch-expression-case* → *default-label* *statement* +> *enum-case-name* → *identifier* +> +> +> +> *raw-value-style-enum* → **`enum`** *enum-name* *generic-parameter-clause*_?_ *type-inheritance-clause* *generic-where-clause*_?_ **`{`** *raw-value-style-enum-members* **`}`** +> +> *raw-value-style-enum-members* → *raw-value-style-enum-member* *raw-value-style-enum-members*_?_ +> +> *raw-value-style-enum-member* → *declaration* | *raw-value-style-enum-case-clause* | *compiler-control-statement* +> +> *raw-value-style-enum-case-clause* → *attributes*_?_ **`case`** *raw-value-style-enum-case-list* +> +> *raw-value-style-enum-case-list* → *raw-value-style-enum-case* | *raw-value-style-enum-case* **`,`** *raw-value-style-enum-case-list* +> +> *raw-value-style-enum-case* → *enum-case-name* *raw-value-assignment*_?_ +> +> *raw-value-assignment* → **`=`** *raw-value-literal* +> +> *raw-value-literal* → *numeric-literal* | *static-string-literal* | *boolean-literal* -> GRAMMAR OF A CLOSURE EXPRESSION -> closure-expression → `{` [closure-signature](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-signature)opt [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt `}` -> closure-signature → [capture-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-list)opt [closure-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-parameter-clause) `throws`opt [function-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-result)opt `in` -> closure-signature → [capture-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-list) `in` -> closure-parameter-clause → `(` `)` \| `(` [closure-parameter-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-parameter-list) `)` \| [identifier-list](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier-list) -> closure-parameter-list → [closure-parameter](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-parameter) \| [closure-parameter](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-parameter) `,` [closure-parameter-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-parameter-list) -> closure-parameter → [closure-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-parameter-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation)opt -> closure-parameter → [closure-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-parameter-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) `...` -> closure-parameter-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> capture-list → `[` [capture-list-items](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-list-items) `]` -> capture-list-items → [capture-list-item](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-list-item) \| [capture-list-item](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-list-item) `,` [capture-list-items](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-list-items) -> capture-list-item → [capture-specifier](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-specifier)opt [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> capture-list-item → [capture-specifier](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-specifier)opt [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `=` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) -> capture-list-item → [capture-specifier](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_capture-specifier)opt [self-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_self-expression) -> capture-specifier → `weak` \| `unowned` \| `unowned(safe)` \| `unowned(unsafe)` - -> GRAMMAR OF A IMPLICIT MEMBER EXPRESSION -> implicit-member-expression → `.` [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> implicit-member-expression → `.` [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `.` [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) - -> GRAMMAR OF A PARENTHESIZED EXPRESSION -> parenthesized-expression → `(` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` - -> GRAMMAR OF A TUPLE EXPRESSION -> tuple-expression → `(` `)` \| `(` [tuple-element](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_tuple-element) `,` [tuple-element-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_tuple-element-list) `)` -> tuple-element-list → [tuple-element](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_tuple-element) \| [tuple-element](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_tuple-element) `,` [tuple-element-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_tuple-element-list) -> tuple-element → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) \| [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) - -> GRAMMAR OF A WILDCARD EXPRESSION -> wildcard-expression → `_` - -> GRAMMAR OF A KEY-PATH EXPRESSION -> key-path-expression → `\` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type)opt `.` [key-path-components](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-components) -> key-path-components → [key-path-component](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-component) \| [key-path-component](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-component) `.` [key-path-components](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-components) -> key-path-component → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) [key-path-postfixes](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-postfixes)opt \| [key-path-postfixes](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-postfixes) -> key-path-postfixes → [key-path-postfix](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-postfix) [key-path-postfixes](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_key-path-postfixes)opt -> key-path-postfix → `?` \| `!` \| `self` \| `[` [function-call-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-list) `]` - -> GRAMMAR OF A SELECTOR EXPRESSION -> selector-expression → `#selector` `(` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` -> selector-expression → `#selector` `(` `getter:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` -> selector-expression → `#selector` `(` `setter:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` - -> GRAMMAR OF A KEY-PATH STRING EXPRESSION -> key-path-string-expression → `#keyPath` `(` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `)` - -> GRAMMAR OF A POSTFIX EXPRESSION -> postfix-expression → [primary-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_primary-expression) -> postfix-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) [postfix-operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_postfix-operator) -> postfix-expression → [function-call-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-expression) -> postfix-expression → [initializer-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_initializer-expression) -> postfix-expression → [explicit-member-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_explicit-member-expression) -> postfix-expression → [postfix-self-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-self-expression) -> postfix-expression → [subscript-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_subscript-expression) -> postfix-expression → [forced-value-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_forced-value-expression) -> postfix-expression → [optional-chaining-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_optional-chaining-expression) - -> GRAMMAR OF A FUNCTION CALL EXPRESSION -> function-call-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) [function-call-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-clause) -> function-call-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) [function-call-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-clause)opt [trailing-closures](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_trailing-closures) -> function-call-argument-clause → `(` `)` \| `(` [function-call-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-list) `)` -> function-call-argument-list → [function-call-argument](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument) \| [function-call-argument](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument) `,` [function-call-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-list) -> function-call-argument → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) \| [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `:` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) -> function-call-argument → [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) \| [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `:` [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> trailing-closures → [closure-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-expression) [labeled-trailing-closures](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_labeled-trailing-closures)opt -> labeled-trailing-closures → [labeled-trailing-closure](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_labeled-trailing-closure) [labeled-trailing-closures](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_labeled-trailing-closures)opt -> labeled-trailing-closure → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `:` [closure-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_closure-expression) - -> GRAMMAR OF AN INITIALIZER EXPRESSION -> initializer-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) `.` `init` -> initializer-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) `.` `init` `(` [argument-names](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_argument-names) `)` - -> GRAMMAR OF AN EXPLICIT MEMBER EXPRESSION -> explicit-member-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) `.` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) -> explicit-member-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) `.` [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) [generic-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument-clause)opt -> explicit-member-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) `.` [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `(` [argument-names](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_argument-names) `)` -> argument-names → [argument-name](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_argument-name) [argument-names](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_argument-names)opt -> argument-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `:` - -> GRAMMAR OF A POSTFIX SELF EXPRESSION -> postfix-self-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) `.` `self` - -> GRAMMAR OF A SUBSCRIPT EXPRESSION -> subscript-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) `[` [function-call-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_function-call-argument-list) `]` - -> GRAMMAR OF A FORCED-VALUE EXPRESSION -> forced-value-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) `!` - -> GRAMMAR OF AN OPTIONAL-CHAINING EXPRESSION -> optional-chaining-expression → [postfix-expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_postfix-expression) `?` +> Grammar of a structure declaration: +> +> *struct-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`struct`** *struct-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ *struct-body* +> +> *struct-name* → *identifier* +> +> *struct-body* → **`{`** *struct-members*_?_ **`}`** +> +> +> +> *struct-members* → *struct-member* *struct-members*_?_ +> +> *struct-member* → *declaration* | *compiler-control-statement* -## Statements\(文\) +> Grammar of a class declaration: +> +> *class-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`final`**_?_ **`class`** *class-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ *class-body* +> +> *class-declaration* → *attributes*_?_ **`final`** *access-level-modifier*_?_ **`class`** *class-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ *class-body* +> +> *class-name* → *identifier* +> +> *class-body* → **`{`** *class-members*_?_ **`}`** +> +> +> +> *class-members* → *class-member* *class-members*_?_ +> +> *class-member* → *declaration* | *compiler-control-statement* + +> Grammar of an actor declaration: +> +> *actor-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`actor`** *actor-name* *generic-parameter-clause*_?_ *type-inheritance-clause*_?_ *generic-where-clause*_?_ *actor-body* +> +> *actor-name* → *identifier* +> +> *actor-body* → **`{`** *actor-members*_?_ **`}`** +> +> +> +> *actor-members* → *actor-member* *actor-members*_?_ +> +> *actor-member* → *declaration* | *compiler-control-statement* + +> Grammar of a protocol declaration: +> +> *protocol-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`protocol`** *protocol-name* *type-inheritance-clause*_?_ *generic-where-clause*_?_ *protocol-body* +> +> *protocol-name* → *identifier* +> +> *protocol-body* → **`{`** *protocol-members*_?_ **`}`** +> +> +> +> *protocol-members* → *protocol-member* *protocol-members*_?_ +> +> *protocol-member* → *protocol-member-declaration* | *compiler-control-statement* +> +> +> +> *protocol-member-declaration* → *protocol-property-declaration* +> +> *protocol-member-declaration* → *protocol-method-declaration* +> +> *protocol-member-declaration* → *protocol-initializer-declaration* +> +> *protocol-member-declaration* → *protocol-subscript-declaration* +> +> *protocol-member-declaration* → *protocol-associated-type-declaration* +> +> *protocol-member-declaration* → *typealias-declaration* + +> Grammar of a protocol property declaration: +> +> *protocol-property-declaration* → *variable-declaration-head* *variable-name* *type-annotation* *getter-setter-keyword-block* + +> Grammar of a protocol method declaration: +> +> *protocol-method-declaration* → *function-head* *function-name* *generic-parameter-clause*_?_ *function-signature* *generic-where-clause*_?_ + +> Grammar of a protocol initializer declaration: +> +> *protocol-initializer-declaration* → *initializer-head* *generic-parameter-clause*_?_ *parameter-clause* **`throws`**_?_ *generic-where-clause*_?_ +> +> *protocol-initializer-declaration* → *initializer-head* *generic-parameter-clause*_?_ *parameter-clause* **`rethrows`** *generic-where-clause*_?_ -> GRAMMAR OF A STATEMENT -> statement → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `;`opt -> statement → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) `;`opt -> statement → [loop-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_loop-statement) `;`opt -> statement → [branch-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_branch-statement) `;`opt -> statement → [labeled-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_labeled-statement) `;`opt -> statement → [control-transfer-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_control-transfer-statement) `;`opt -> statement → [defer-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_defer-statement) `;`opt -> statement → [do-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_do-statement) `;`opt -> statement → [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) -> statements → [statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt - -> GRAMMAR OF A LOOP STATEMENT -> loop-statement → [for-in-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_for-in-statement) -> loop-statement → [while-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_while-statement) -> loop-statement → [repeat-while-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_repeat-while-statement) - -> GRAMMAR OF A FOR-IN STATEMENT -> for-in-statement → `for` `case`opt [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) `in` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) [where-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-clause)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) - -> GRAMMAR OF A WHILE STATEMENT -> while-statement → `while` [condition-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list) [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> condition-list → [condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition) \| [condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition) `,` [condition-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list) -> condition → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) \| [availability-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-condition) \| [case-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_case-condition) \| [optional-binding-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_optional-binding-condition) -> case-condition → `case` [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer) -> optional-binding-condition → `let` [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer) \| `var` [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer) - -> GRAMMAR OF A REPEAT-WHILE STATEMENT -> repeat-while-statement → `repeat` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) `while` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) - -> GRAMMAR OF A BRANCH STATEMENT -> branch-statement → [if-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-statement) -> branch-statement → [guard-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_guard-statement) -> branch-statement → [switch-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-statement) - -> GRAMMAR OF AN IF STATEMENT -> if-statement → `if` [condition-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list) [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) [else-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_else-clause)opt -> else-clause → `else` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) \| `else` [if-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-statement) - -> GRAMMAR OF A GUARD STATEMENT -> guard-statement → `guard` [condition-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_condition-list) `else` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) - -> GRAMMAR OF A SWITCH STATEMENT -> switch-statement → `switch` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) `{` [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt `}` -> switch-cases → [switch-case](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-case) [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt -> switch-case → [case-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_case-label) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements) -> switch-case → [default-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_default-label) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements) -> switch-case → [conditional-switch-case](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_conditional-switch-case) -> case-label → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `case` [case-item-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_case-item-list) `:` -> case-item-list → [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [where-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-clause)opt \| [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [where-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-clause)opt `,` [case-item-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_case-item-list) -> default-label → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `default` `:` -> where-clause → `where` [where-expression](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-expression) -> where-expression → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) -> conditional-switch-case → [switch-if-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-if-directive-clause) [switch-elseif-directive-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-elseif-directive-clauses)opt [switch-else-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-else-directive-clause)opt [endif-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_endif-directive) -> switch-if-directive-clause → [if-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-directive) [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt -> switch-elseif-directive-clauses → [elseif-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive-clause) [switch-elseif-directive-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-elseif-directive-clauses)opt -> switch-elseif-directive-clause → [elseif-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive) [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt -> switch-else-directive-clause → [else-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_else-directive) [switch-cases](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-cases)opt - -> GRAMMAR OF A LABELED STATEMENT -> labeled-statement → [statement-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement-label) [loop-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_loop-statement) -> labeled-statement → [statement-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement-label) [if-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-statement) -> labeled-statement → [statement-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement-label) [switch-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_switch-statement) -> labeled-statement → [statement-label](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statement-label) [do-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_do-statement) -> statement-label → [label-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_label-name) `:` -> label-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) - -> GRAMMAR OF A CONTROL TRANSFER STATEMENT -> control-transfer-statement → [break-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_break-statement) -> control-transfer-statement → [continue-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_continue-statement) -> control-transfer-statement → [fallthrough-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_fallthrough-statement) -> control-transfer-statement → [return-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_return-statement) -> control-transfer-statement → [throw-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_throw-statement) - -> GRAMMAR OF A BREAK STATEMENT -> break-statement → `break` [label-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_label-name)opt - -> GRAMMAR OF A CONTINUE STATEMENT -> continue-statement → `continue` [label-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_label-name)opt - -> GRAMMAR OF A FALLTHROUGH STATEMENT -> fallthrough-statement → `fallthrough` - -> GRAMMAR OF A RETURN STATEMENT -> return-statement → `return` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression)opt - -> GRAMMAR OF A THROW STATEMENT -> throw-statement → `throw` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) - -> GRAMMAR OF A DEFER STATEMENT -> defer-statement → `defer` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) - -> GRAMMAR OF A DO STATEMENT -> do-statement → `do` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) [catch-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-clauses)opt -> catch-clauses → [catch-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-clause) [catch-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-clauses)opt -> catch-clause → `catch` [catch-pattern-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-pattern-list)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> catch-pattern-list → [catch-pattern](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-pattern) \| [catch-pattern](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-pattern) `,` [catch-pattern-list](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_catch-pattern-list) -> catch-pattern → [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [where-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_where-clause)opt - -> GRAMMAR OF A COMPILER CONTROL STATEMENT -> compiler-control-statement → [conditional-compilation-block](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_conditional-compilation-block) -> compiler-control-statement → [line-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_line-control-statement) -> compiler-control-statement → [diagnostic-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_diagnostic-statement) - -> GRAMMAR OF A CONDITIONAL COMPILATION BLOCK -> conditional-compilation-block → [if-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-directive-clause) [elseif-directive-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive-clauses)opt [else-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_else-directive-clause)opt [endif-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_endif-directive) -> if-directive-clause → [if-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_if-directive) [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt -> elseif-directive-clauses → [elseif-directive-clause](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive-clause) [elseif-directive-clauses](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive-clauses)opt -> elseif-directive-clause → [elseif-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_elseif-directive) [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt -> else-directive-clause → [else-directive](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_else-directive) [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt -> if-directive → `#if` -> elseif-directive → `#elseif` -> else-directive → `#else` -> endif-directive → `#endif` -> compilation-condition → [platform-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_platform-condition) -> compilation-condition → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> compilation-condition → [boolean-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_boolean-literal) -> compilation-condition → `(` [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) `)` -> compilation-condition → `!` [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) -> compilation-condition → [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) `&&` [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) -> compilation-condition → [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) `||` [compilation-condition](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compilation-condition) -> platform-condition → `os` `(` [operating-system](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_operating-system) `)` -> platform-condition → `arch` `(` [architecture](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_architecture) `)` -> platform-condition → `swift` `(` `>=` [swift-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version) `)` \| `swift` `(` `<` [swift-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version) `)` -> platform-condition → `compiler` `(` `>=` [swift-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version) `)` \| `compiler` `(` `<` [swift-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version) `)` -> platform-condition → `canImport` `(` [module-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_module-name) `)` -> platform-condition → `targetEnvironment` `(` [environment](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_environment) `)` -> operating-system → `macOS` \| `iOS` \| `watchOS` \| `tvOS` \| `Linux` \| `Windows` -> architecture → `i386` \| `x86_64` \| `arm` \| `arm64` -> swift-version → [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) [swift-version-continuation](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version-continuation)opt -> swift-version-continuation → `.` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) [swift-version-continuation](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_swift-version-continuation)opt -> module-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> environment → `simulator` \| `macCatalyst` - -> GRAMMAR OF A LINE CONTROL STATEMENT -> line-control-statement → `#sourceLocation` `(` `file:` [file-path](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_file-path) `,` `line:` [line-number](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_line-number) `)` -> line-control-statement → `#sourceLocation` `(` `)` -> line-number → 0 以上の 10進整数 -> file-path → [static-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_static-string-literal) - -> GRAMMAR OF A COMPILE-TIME DIAGNOSTIC STATEMENT -> diagnostic-statement → `#error` `(` [diagnostic-message](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_diagnostic-message) `)` -> diagnostic-statement → `#warning` `(` [diagnostic-message](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_diagnostic-message) `)` -> diagnostic-message → [static-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_static-string-literal) - -> GRAMMAR OF AN AVAILABILITY CONDITION -> availability-condition → `#available` `(` [availability-arguments](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-arguments) `)` -> availability-arguments → [availability-argument](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-argument) \| [availability-argument](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-argument) `,` [availability-arguments](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_availability-arguments) -> availability-argument → [platform-name](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_platform-name) [platform-version](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_platform-version) -> availability-argument → `*` -> platform-name → `iOS` \| `iOSApplicationExtension` -> platform-name → `macOS` \| `macOSApplicationExtension` -> platform-name → `macCatalyst` \| `macCatalystApplicationExtension` -> platform-name → `watchOS` -> platform-name → `tvOS` -> platform-version → [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) -> platform-version → [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) `.` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) -> platform-version → [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) `.` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) `.` [decimal-digits](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_decimal-digits) - -## Declarations\(宣言\) - -> GRAMMAR OF A DECLARATION -> declaration → [import-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-declaration) -> declaration → [constant-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_constant-declaration) -> declaration → [variable-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration) -> declaration → [typealias-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-declaration) -> declaration → [function-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-declaration) -> declaration → [enum-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-declaration) -> declaration → [struct-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-declaration) -> declaration → [class-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-declaration) -> declaration → [protocol-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-declaration) -> declaration → [initializer-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-declaration) -> declaration → [deinitializer-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_deinitializer-declaration) -> declaration → [extension-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-declaration) -> declaration → [subscript-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-declaration) -> declaration → [operator-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_operator-declaration) -> declaration → [precedence-group-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-declaration) -> declarations → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) [declarations](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declarations)opt - -> GRAMMAR OF A TOP-LEVEL DECLARATION -> top-level-declaration → [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt - -> GRAMMAR OF A CODE BLOCK -> code-block → `{` [statements](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_statements)opt `}` - -> GRAMMAR OF AN IMPORT DECLARATION -> import-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `import` [import-kind](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-kind)opt [import-path](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-path) -> import-kind → `typealias` \| `struct` \| `class` \| `enum` \| `protocol` \| `let` \| `var` \| `func` -> import-path → [import-path-identifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-path-identifier) \| [import-path-identifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-path-identifier) `.` [import-path](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_import-path) -> import-path-identifier → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) \| [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) - -> GRAMMAR OF A CONSTANT DECLARATION -> constant-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `let` [pattern-initializer-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer-list) -> pattern-initializer-list → [pattern-initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer) \| [pattern-initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer) `,` [pattern-initializer-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer-list) -> pattern-initializer → [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer)opt -> initializer → `=` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) - -> GRAMMAR OF A VARIABLE DECLARATION -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [pattern-initializer-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_pattern-initializer-list) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [getter-setter-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-block) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [getter-setter-keyword-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-keyword-block) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer) [willSet-didSet-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_willSet-didSet-block) -> variable-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [initializer](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer)opt [willSet-didSet-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_willSet-didSet-block) -> variable-declaration-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `var` -> variable-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> getter-setter-block → [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> getter-setter-block → `{` [getter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-clause) [setter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-clause)opt `}` -> getter-setter-block → `{` [setter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-clause) [getter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-clause) `}` -> getter-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier)opt `get` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> setter-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier)opt `set` [setter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-name)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> setter-name → `(` [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `)` -> getter-setter-keyword-block → `{` [getter-keyword-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-keyword-clause) [setter-keyword-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-keyword-clause)opt `}` -> getter-setter-keyword-block → `{` [setter-keyword-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-keyword-clause) [getter-keyword-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-keyword-clause) `}` -> getter-keyword-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier)opt `get` -> setter-keyword-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier)opt `set` -> willSet-didSet-block → `{` [willSet-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_willSet-clause) [didSet-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_didSet-clause)opt `}` -> willSet-didSet-block → `{` [didSet-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_didSet-clause) [willSet-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_willSet-clause)opt `}` -> willSet-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `willSet` [setter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-name)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> didSet-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `didSet` [setter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_setter-name)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) - -> GRAMMAR OF A TYPE ALIAS DECLARATION -> typealias-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `typealias` [typealias-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [typealias-assignment](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-assignment) -> typealias-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> typealias-assignment → `=` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) - -> GRAMMAR OF A FUNCTION DECLARATION -> function-declaration → [function-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-head) [function-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [function-signature](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-signature)[generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [function-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-body)opt -> function-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `func` -> function-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) \| [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> function-signature → [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `async`opt `throws`opt [function-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-result)opt -> function-signature → [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `async`opt `rethrows` [function-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-result)opt -> function-result → `->` [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> function-body → [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> parameter-clause → `(` `)` \| `(` [parameter-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-list) `)` -> parameter-list → [parameter](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter) \| [parameter](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter) `,` [parameter-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-list) -> parameter → [external-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_external-parameter-name)opt [local-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_local-parameter-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [default-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_default-argument-clause)opt -> parameter → [external-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_external-parameter-name)opt [local-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_local-parameter-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) -> parameter → [external-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_external-parameter-name)opt [local-parameter-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_local-parameter-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) `...` -> external-parameter-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> local-parameter-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> default-argument-clause → `=` [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) - -> GRAMMAR OF AN ENUMERATION DECLARATION -> enum-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt [union-style-enum](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum) -> enum-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt [raw-value-style-enum](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum) -> union-style-enum → `indirect`opt `enum` [enum-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt `{` [union-style-enum-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-members)opt `}` -> union-style-enum-members → [union-style-enum-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-member) [union-style-enum-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-members)opt -> union-style-enum-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [union-style-enum-case-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case-clause) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) -> union-style-enum-case-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `indirect`opt `case` [union-style-enum-case-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case-list) -> union-style-enum-case-list → [union-style-enum-case](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case) \| [union-style-enum-case](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case) `,` [union-style-enum-case-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_union-style-enum-case-list) -> union-style-enum-case → [enum-case-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-case-name) [tuple-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type)opt -> enum-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> enum-case-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> raw-value-style-enum → `enum` [enum-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)[generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt `{` [raw-value-style-enum-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-members) `}` -> raw-value-style-enum-members → [raw-value-style-enum-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-member) [raw-value-style-enum-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-members)opt -> raw-value-style-enum-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [raw-value-style-enum-case-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case-clause) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) -> raw-value-style-enum-case-clause → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `case` [raw-value-style-enum-case-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case-list) -> raw-value-style-enum-case-list → [raw-value-style-enum-case](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case) \| [raw-value-style-enum-case](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case) `,` [raw-value-style-enum-case-list](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-style-enum-case-list) -> raw-value-style-enum-case → [enum-case-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-case-name) [raw-value-assignment](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-assignment)opt -> raw-value-assignment → `=` [raw-value-literal](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_raw-value-literal) -> raw-value-literal → [numeric-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_numeric-literal) \| [static-string-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_static-string-literal) \| [boolean-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_boolean-literal) - -> GRAMMAR OF A STRUCTURE DECLARATION -> struct-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `struct` [struct-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [struct-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-body) -> struct-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> struct-body → `{` [struct-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-members)opt `}` -> struct-members → [struct-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-member) [struct-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_struct-members)opt -> struct-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) - -> GRAMMAR OF A CLASS DECLARATION -> class-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `final`opt `class` [class-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [class-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-body) -> class-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `final` [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `class` [class-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [class-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-body) -> class-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> class-body → `{` [class-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-members)opt `}` -> class-members → [class-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-member) [class-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_class-members)opt -> class-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) - -> GRAMMAR OF A ACTOR DECLARATION -> actor-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `actor` [struct-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [actor-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-body) -> actor-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> actor-body → `{` [actor-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-members)opt `}` -> actor-members → [actor-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-member) [actor-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_actor-members)opt -> actor-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) - -> GRAMMAR OF A PROTOCOL DECLARATION -> protocol-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `protocol` [protocol-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-name) [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [protocol-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-body) -> protocol-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> protocol-body → `{` [protocol-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-members)opt `}` -> protocol-members → [protocol-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-member) [protocol-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-members)opt -> protocol-member → [protocol-member-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-member-declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) -> protocol-member-declaration → [protocol-property-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-property-declaration) -> protocol-member-declaration → [protocol-method-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-method-declaration) -> protocol-member-declaration → [protocol-initializer-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-initializer-declaration) -> protocol-member-declaration → [protocol-subscript-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-subscript-declaration) -> protocol-member-declaration → [protocol-associated-type-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_protocol-associated-type-declaration) -> protocol-member-declaration → [typealias-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-declaration) - -> GRAMMAR OF A PROTOCOL PROPERTY DECLARATION -> protocol-property-declaration → [variable-declaration-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-declaration-head) [variable-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_variable-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) [getter-setter-keyword-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-keyword-block) - -> GRAMMAR OF A PROTOCOL METHOD DECLARATION -> protocol-method-declaration → [function-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-head) [function-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-name) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [function-signature](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_function-signature) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt - -> GRAMMAR OF A PROTOCOL INITIALIZER DECLARATION -> protocol-initializer-declaration → [initializer-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-head) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `throws`opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt -> protocol-initializer-declaration → [initializer-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-head) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `rethrows` [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt - -> GRAMMAR OF A PROTOCOL SUBSCRIPT DECLARATION -> protocol-subscript-declaration → [subscript-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-head) [subscript-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-result) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [getter-setter-keyword-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-keyword-block) - -> GRAMMAR OF A PROTOCOL ASSOCIATED TYPE DECLARATION -> protocol-associated-type-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `associatedtype`[typealias-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-name) [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [typealias-assignment](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-assignment)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt - -> GRAMMAR OF AN INITIALIZER DECLARATION -> initializer-declaration → [initializer-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-head) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `throws`opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [initializer-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-body) -> initializer-declaration → [initializer-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-head) [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) `rethrows` [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [initializer-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-body) -> initializer-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `init` -> initializer-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `init` `?` -> initializer-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `init` `!` -> initializer-body → [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) - -> GRAMMAR OF A DEINITIALIZER DECLARATION -> deinitializer-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `deinit` [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) - -> GRAMMAR OF AN EXTENSION DECLARATION -> extension-declaration → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier)opt `extension` [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) [type-inheritance-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-clause)opt [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [extension-body](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-body) -> extension-body → `{` [extension-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-members)opt `}` -> extension-members → [extension-member](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-member) [extension-members](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_extension-members)opt -> extension-member → [declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration) \| [compiler-control-statement](https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_compiler-control-statement) - -> GRAMMAR OF A SUBSCRIPT DECLARATION -> subscript-declaration → [subscript-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-head) [subscript-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-result) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [code-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_code-block) -> subscript-declaration → [subscript-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-head) [subscript-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-result) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [getter-setter-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-block) -> subscript-declaration → [subscript-head](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-head) [subscript-result](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_subscript-result) [generic-where-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-where-clause)opt [getter-setter-keyword-block](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_getter-setter-keyword-block) -> subscript-head → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt `subscript` [generic-parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-clause)opt [parameter-clause](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_parameter-clause) -> subscript-result → `->` [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) - -> GRAMMAR OF AN OPERATOR DECLARATION -> operator-declaration → [prefix-operator-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_prefix-operator-declaration) \| [postfix-operator-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_postfix-operator-declaration) \| [infix-operator-declaration](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_infix-operator-declaration) -> prefix-operator-declaration → `prefix` `operator` [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> postfix-operator-declaration → `postfix` `operator` [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) -> infix-operator-declaration → `infix` `operator` [operator](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_operator) [infix-operator-group](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_infix-operator-group)opt -> infix-operator-group → `:` [precedence-group-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-name) - -> GRAMMAR OF A PRECEDENCE GROUP DECLARATION -> precedence-group-declaration → `precedencegroup` [precedence-group-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-name) `{` [precedence-group-attributes](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-attributes)opt `}` -> precedence-group-attributes → [precedence-group-attribute](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-attribute) [precedence-group-attributes](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-attributes)opt -> precedence-group-attribute → [precedence-group-relation](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-relation) -> precedence-group-attribute → [precedence-group-assignment](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-assignment) -> precedence-group-attribute → [precedence-group-associativity](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-associativity) -> precedence-group-relation → `higherThan` `:` [precedence-group-names](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-names) -> precedence-group-relation → `lowerThan` `:` [precedence-group-names](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-names) -> precedence-group-assignment → `assignment` `:` [boolean-literal](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_boolean-literal) -> precedence-group-associativity → `associativity` `:` `left` -> precedence-group-associativity → `associativity` `:` `right` -> precedence-group-associativity → `associativity` `:` `none` -> precedence-group-names → [precedence-group-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-name) \| [precedence-group-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-name) `,` [precedence-group-names](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_precedence-group-names) -> precedence-group-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) - -> GRAMMAR OF A DECLARATION MODIFIER -> declaration-modifier → `class` \| `convenience` \| `dynamic` \| `final` \| `infix` \| `lazy` \| `optional` \| `override` \| `postfix` \| `prefix` \| `required` \| `static` \| `unowned` \| `unowned` `(` `safe` `)` \| `unowned(` `unsafe` `)` \| `weak` -> declaration-modifier → [access-level-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_access-level-modifier) -> declaration-modifier → [mutation-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_mutation-modifier) -> declaration-modifiers → [declaration-modifier](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifier) [declaration-modifiers](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_declaration-modifiers)opt -> access-level-modifier → `private` \| `private` `(` `set` `)` -> access-level-modifier → `fileprivate` \| `fileprivate` `(` `set` `)` -> access-level-modifier → `internal` \| `internal` `(` `set` `)` -> access-level-modifier → `public` \| `public` `(` `set` `)` -> access-level-modifier → `open` \| `open` `(` `set` `)` -> mutation-modifier → `mutating` \| `nonmutating` -> actor-isolation-modifier → `nonisolated` +> Grammar of a protocol subscript declaration: +> +> *protocol-subscript-declaration* → *subscript-head* *subscript-result* *generic-where-clause*_?_ *getter-setter-keyword-block* + +> Grammar of a protocol associated type declaration: +> +> *protocol-associated-type-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`associatedtype`** *typealias-name* *type-inheritance-clause*_?_ *typealias-assignment*_?_ *generic-where-clause*_?_ + +> Grammar of an initializer declaration: +> +> *initializer-declaration* → *initializer-head* *generic-parameter-clause*_?_ *parameter-clause* **`async`**_?_ **`throws`**_?_ *generic-where-clause*_?_ *initializer-body* +> +> *initializer-declaration* → *initializer-head* *generic-parameter-clause*_?_ *parameter-clause* **`async`**_?_ **`rethrows`** *generic-where-clause*_?_ *initializer-body* +> +> *initializer-head* → *attributes*_?_ *declaration-modifiers*_?_ **`init`** +> +> *initializer-head* → *attributes*_?_ *declaration-modifiers*_?_ **`init`** **`?`** +> +> *initializer-head* → *attributes*_?_ *declaration-modifiers*_?_ **`init`** **`!`** +> +> *initializer-body* → *code-block* + +> Grammar of a deinitializer declaration: +> +> *deinitializer-declaration* → *attributes*_?_ **`deinit`** *code-block* + +> Grammar of an extension declaration: +> +> *extension-declaration* → *attributes*_?_ *access-level-modifier*_?_ **`extension`** *type-identifier* *type-inheritance-clause*_?_ *generic-where-clause*_?_ *extension-body* +> +> *extension-body* → **`{`** *extension-members*_?_ **`}`** +> +> +> +> *extension-members* → *extension-member* *extension-members*_?_ +> +> *extension-member* → *declaration* | *compiler-control-statement* + +> Grammar of a subscript declaration: +> +> *subscript-declaration* → *subscript-head* *subscript-result* *generic-where-clause*_?_ *code-block* +> +> *subscript-declaration* → *subscript-head* *subscript-result* *generic-where-clause*_?_ *getter-setter-block* +> +> *subscript-declaration* → *subscript-head* *subscript-result* *generic-where-clause*_?_ *getter-setter-keyword-block* +> +> *subscript-head* → *attributes*_?_ *declaration-modifiers*_?_ **`subscript`** *generic-parameter-clause*_?_ *parameter-clause* +> +> *subscript-result* → **`->`** *attributes*_?_ *type* + +> Grammar of an operator declaration: +> +> *operator-declaration* → *prefix-operator-declaration* | *postfix-operator-declaration* | *infix-operator-declaration* +> +> +> +> *prefix-operator-declaration* → **`prefix`** **`operator`** *operator* +> +> *postfix-operator-declaration* → **`postfix`** **`operator`** *operator* +> +> *infix-operator-declaration* → **`infix`** **`operator`** *operator* *infix-operator-group*_?_ +> +> +> +> *infix-operator-group* → **`:`** *precedence-group-name* + +> Grammar of a precedence group declaration: +> +> *precedence-group-declaration* → **`precedencegroup`** *precedence-group-name* **`{`** *precedence-group-attributes*_?_ **`}`** +> +> +> +> *precedence-group-attributes* → *precedence-group-attribute* *precedence-group-attributes*_?_ +> +> *precedence-group-attribute* → *precedence-group-relation* +> +> *precedence-group-attribute* → *precedence-group-assignment* +> +> *precedence-group-attribute* → *precedence-group-associativity* +> +> +> +> *precedence-group-relation* → **`higherThan`** **`:`** *precedence-group-names* +> +> *precedence-group-relation* → **`lowerThan`** **`:`** *precedence-group-names* +> +> +> +> *precedence-group-assignment* → **`assignment`** **`:`** *boolean-literal* +> +> +> +> *precedence-group-associativity* → **`associativity`** **`:`** **`left`** +> +> *precedence-group-associativity* → **`associativity`** **`:`** **`right`** +> +> *precedence-group-associativity* → **`associativity`** **`:`** **`none`** +> +> +> +> *precedence-group-names* → *precedence-group-name* | *precedence-group-name* **`,`** *precedence-group-names* +> +> *precedence-group-name* → *identifier* + +> Grammar of a declaration modifier: +> +> *declaration-modifier* → **`class`** | **`convenience`** | **`dynamic`** | **`final`** | **`infix`** | **`lazy`** | **`optional`** | **`override`** | **`postfix`** | **`prefix`** | **`required`** | **`static`** | **`unowned`** | **`unowned`** **`(`** **`safe`** **`)`** | **`unowned`** **`(`** **`unsafe`** **`)`** | **`weak`** +> +> *declaration-modifier* → *access-level-modifier* +> +> *declaration-modifier* → *mutation-modifier* +> +> *declaration-modifier* → *actor-isolation-modifier* +> +> *declaration-modifiers* → *declaration-modifier* *declaration-modifiers*_?_ +> +> +> +> *access-level-modifier* → **`private`** | **`private`** **`(`** **`set`** **`)`** +> +> *access-level-modifier* → **`fileprivate`** | **`fileprivate`** **`(`** **`set`** **`)`** +> +> *access-level-modifier* → **`internal`** | **`internal`** **`(`** **`set`** **`)`** +> +> *access-level-modifier* → **`public`** | **`public`** **`(`** **`set`** **`)`** +> +> *access-level-modifier* → **`open`** | **`open`** **`(`** **`set`** **`)`** +> +> +> +> *mutation-modifier* → **`mutating`** | **`nonmutating`** +> +> +> +> *actor-isolation-modifier* → **`nonisolated`** ## Attributes\(属性\) -> GRAMMAR OF AN ATTRIBUTE -> attribute → `@` [attribute-name](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attribute-name) [attribute-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attribute-argument-clause)opt -> attribute-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) -> attribute-argument-clause → `(` [balanced-tokens](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_balanced-tokens)opt `)` -> attributes → [attribute](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attribute) [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt -> balanced-tokens → [balanced-token](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_balanced-token) [balanced-tokens](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_balanced-tokens)opt -> balanced-token → `(` [balanced-tokens](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_balanced-tokens)opt `)` -> balanced-token → `[` [balanced-tokens](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_balanced-tokens)opt `]` -> balanced-token → `{` [balanced-tokens](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_balanced-tokens)opt `}` -> balanced-token → 任意の識別子、キーワード、リテラル、または演算子 -> balanced-token → `(`, `)`, `[`, `]`, `{`, または `}` を除く任意の句読点 +> Grammar of an attribute: +> +> *attribute* → **`@`** *attribute-name* *attribute-argument-clause*_?_ +> +> *attribute-name* → *identifier* +> +> *attribute-argument-clause* → **`(`** *balanced-tokens*_?_ **`)`** +> +> *attributes* → *attribute* *attributes*_?_ +> +> +> +> *balanced-tokens* → *balanced-token* *balanced-tokens*_?_ +> +> *balanced-token* → **`(`** *balanced-tokens*_?_ **`)`** +> +> *balanced-token* → **`[`** *balanced-tokens*_?_ **`]`** +> +> *balanced-token* → **`{`** *balanced-tokens*_?_ **`}`** +> +> *balanced-token* → Any identifier, keyword, literal, または operator +> +> *balanced-token* → Any punctuation except **`(`**, **`)`**, **`[`**, **`]`**, **`{`**, または **`}`** ## Patterns\(パターン\) -> GRAMMAR OF A PATTERN -> pattern → [wildcard-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_wildcard-pattern) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation)opt -> pattern → [identifier-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_identifier-pattern) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation)opt -> pattern → [value-binding-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_value-binding-pattern) -> pattern → [tuple-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_tuple-pattern) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation)opt -> pattern → [enum-case-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_enum-case-pattern) -> pattern → [optional-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_optional-pattern) -> pattern → [type-casting-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_type-casting-pattern) -> pattern → [expression-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_expression-pattern) +> Grammar of a pattern: +> +> *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* -> GRAMMAR OF A WILDCARD PATTERN -> wildcard-pattern → `_` +> Grammar of a wildcard pattern: +> +> *wildcard-pattern* → **`_`** -> GRAMMAR OF AN IDENTIFIER PATTERN -> identifier-pattern → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) +> Grammar of an identifier pattern: +> +> *identifier-pattern* → *identifier* -> GRAMMAR OF A VALUE-BINDING PATTERN -> value-binding-pattern → `var` [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) \| `let` [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) +> Grammar of a value-binding pattern: +> +> *value-binding-pattern* → **`var`** *pattern* | **`let`** *pattern* -> GRAMMAR OF A TUPLE PATTERN -> tuple-pattern → `(` [tuple-pattern-element-list](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_tuple-pattern-element-list)opt `)` -> tuple-pattern-element-list → [tuple-pattern-element](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_tuple-pattern-element) \| [tuple-pattern-element](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_tuple-pattern-element) `,` [tuple-pattern-element-list](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_tuple-pattern-element-list) -> tuple-pattern-element → [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) \| [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) `:` [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) +> Grammar of a tuple pattern: +> +> *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* -> GRAMMAR OF AN ENUMERATION CASE PATTERN -> enum-case-pattern → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier)opt `.` [enum-case-name](https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_enum-case-name) [tuple-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_tuple-pattern)opt +> Grammar of an enumeration case pattern: +> +> *enum-case-pattern* → *type-identifier*_?_ **`.`** *enum-case-name* *tuple-pattern*_?_ -> GRAMMAR OF AN OPTIONAL PATTERN -> optional-pattern → [identifier-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_identifier-pattern) `?` +> Grammar of an optional pattern: +> +> *optional-pattern* → *identifier-pattern* **`?`** -> GRAMMAR OF A TYPE CASTING PATTERN -> type-casting-pattern → [is-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_is-pattern) \| [as-pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_as-pattern) -> is-pattern → `is` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> as-pattern → [pattern](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_pattern) `as` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) +> Grammar of a type casting pattern: +> +> *type-casting-pattern* → *is-pattern* | *as-pattern* +> +> *is-pattern* → **`is`** *type* +> +> *as-pattern* → *pattern* **`as`** *type* -> GRAMMAR OF AN EXPRESSION PATTERN -> expression-pattern → [expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#grammar_expression) +> Grammar of an expression pattern: +> +> *expression-pattern* → *expression* ## Generic Parameters and Arguments\(ジェネリックパラメータと引数\) -> GRAMMAR OF A GENERIC PARAMETER CLAUSE -> generic-parameter-clause → `<` [generic-parameter-list](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-list) `>` -> generic-parameter-list → [generic-parameter](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter) \| [generic-parameter](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter) `,` [generic-parameter-list](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-parameter-list) -> generic-parameter → [type-name](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-name) -> generic-parameter → [type-name](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-name) `:` [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) -> generic-parameter → [type-name](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-name) `:` [protocol-composition-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_protocol-composition-type) -> generic-where-clause → `where` [requirement-list](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_requirement-list) -> requirement-list → [requirement](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_requirement) \| [requirement](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_requirement) `,` [requirement-list](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_requirement-list) -> requirement → [conformance-requirement](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_conformance-requirement) \| [same-type-requirement](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_same-type-requirement) -> conformance-requirement → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) `:` [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) -> conformance-requirement → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) `:` [protocol-composition-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_protocol-composition-type) -> same-type-requirement → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) `==` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) - -> GRAMMAR OF A GENERIC ARGUMENT CLAUSE -> generic-argument-clause → `<` [generic-argument-list](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument-list) `>` -> generic-argument-list → [generic-argument](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument) \| [generic-argument](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument) `,` [generic-argument-list](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument-list) -> generic-argument → [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) +> Grammar of a generic parameter clause: +> +> *generic-parameter-clause* → **`<`** *generic-parameter-list* **`>`** +> +> *generic-parameter-list* → *generic-parameter* | *generic-parameter* **`,`** *generic-parameter-list* +> +> *generic-parameter* → *type-name* +> +> *generic-parameter* → *type-name* **`:`** *type-identifier* +> +> *generic-parameter* → *type-name* **`:`** *protocol-composition-type* +> +> +> +> *generic-where-clause* → **`where`** *requirement-list* +> +> *requirement-list* → *requirement* | *requirement* **`,`** *requirement-list* +> +> *requirement* → *conformance-requirement* | *same-type-requirement* +> +> +> +> *conformance-requirement* → *type-identifier* **`:`** *type-identifier* +> +> *conformance-requirement* → *type-identifier* **`:`** *protocol-composition-type* +> +> *same-type-requirement* → *type-identifier* **`==`** *type* +> Grammar of a generic argument clause: +> +> *generic-argument-clause* → **`<`** *generic-argument-list* **`>`** +> +> *generic-argument-list* → *generic-argument* | *generic-argument* **`,`** *generic-argument-list* +> +> *generic-argument* → *type* \ No newline at end of file diff --git a/language-reference/types.md b/language-reference/types.md index d102f3ec..6cc82da5 100644 --- a/language-reference/types.md +++ b/language-reference/types.md @@ -1,6 +1,6 @@ # 型\(Types\) -最終更新日: 2023/1/15 +最終更新日: 2023/5/28 原文: https://docs.swift.org/swift-book/ReferenceManual/Types.html 組み込みの名前付き型と複合型を使用します。 @@ -15,20 +15,35 @@ Swift では、_名前付き型_\(_named type_\)と_複合型_\(_compound type_\ この章では、Swift 言語自体で定義されている型について説明し、Swift の型推論の動作について説明します。 -> GRAMMAR OF A TYPE -> type → [function-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type) -> type → [array-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_array-type) -> type → [dictionary-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_dictionary-type) -> type → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) -> type → [tuple-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type) -> type → [optional-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_optional-type) -> type → [implicitly-unwrapped-optional-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_implicitly-unwrapped-optional-type) -> type → [protocol-composition-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_protocol-composition-type) -> type → [opaque-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_opaque-type) -> type → [metatype-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_metatype-type) -> type → [any-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_any-type) -> type → [self-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_self-type) -> type → `(` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `)` +> Grammar of a type: +> +> *type* → *function-type* +> +> *type* → *array-type* +> +> *type* → *dictionary-type* +> +> *type* → *type-identifier* +> +> *type* → *tuple-type* +> +> *type* → *optional-type* +> +> *type* → *implicitly-unwrapped-optional-type* +> +> *type* → *protocol-composition-type* +> +> *type* → *boxed-protocol-type* +> +> *type* → *opaque-type* +> +> *type* → *metatype-type* +> +> *type* → *any-type* +> +> *type* → *self-type* +> +> *type* → **`(`** *type* **`)`** ## 型注釈\(Type Annotation\) @@ -43,8 +58,9 @@ func someFunction(a: Int) { /* ... */ } 型注釈は、型の前に型属性の任意のリストを含めることができます。 -> GRAMMAR OF A TYPE ANNOTATION -> type-annotation → `:` [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt **inout**opt [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) +> Grammar of a type annotation: +> +> *type-annotation* → **`:`** *attributes*_?_ **`inout`**_?_ *type* ## 型識別子\(Type Identifier\) @@ -65,9 +81,11 @@ let origin: PoInt = (0, 0) var someValue: ExampleModule.MyType ``` -> GRAMMAR OF A TYPE IDENTIFIER -> type-identifier → [type-name](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-name) [generic-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument-clause)opt \| [type-name](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-name) [generic-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/GenericParametersAndArguments.html#grammar_generic-argument-clause)opt `.`[type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) -> type-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) +> Grammar of a type identifier: +> +> *type-identifier* → *type-name* *generic-argument-clause*_?_ | *type-name* *generic-argument-clause*_?_ **`.`** *type-identifier* +> +> *type-name* → *identifier* ## タプル型\(Tuple Type\) @@ -86,17 +104,23 @@ someTuple = (left: 5, right: 5) // Error: 名前が一致していません 全てのタプル型には、空のタプル型 `()` のタイプエイリアスの `Void` を除いて、2 つ以上の型が含まれています。 -> GRAMMAR OF A TUPLE TYPE -> tuple-type → `(` `)` \| `(` [tuple-type-element](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element) `,` [tuple-type-element-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element-list) `)` -> tuple-type-element-list → [tuple-type-element](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element) \| [tuple-type-element](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element) `,` [tuple-type-element-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_tuple-type-element-list) -> tuple-type-element → [element-name](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_element-name) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) \| [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> element-name → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) +> Grammar of a tuple type: +> +> *tuple-type* → **`(`** **`)`** | **`(`** *tuple-type-element* **`,`** *tuple-type-element-list* **`)`** +> +> *tuple-type-element-list* → *tuple-type-element* | *tuple-type-element* **`,`** *tuple-type-element-list* +> +> *tuple-type-element* → *element-name* *type-annotation* | *type* +> +> *element-name* → *identifier* ## 関数型\(Function Type\) _関数型_は関数、メソッド、またはクロージャの型を表し、パラメータと矢印で区切られた戻り値の型で構成されています\(`->`\)。 -![Function Type\(関数型\)](../assets/function_type.png) +```swift +(<#parameter type#>) -> <#return type#> +``` _パラメータ型_は、型のカンマ\(`,`\)区切りのリストです。関数型は、_戻り値の型_がタプル型の可能性があるため、複数の値を返す関数とメソッドをサポートします。 @@ -164,19 +188,31 @@ func takesTwoFunctions(first: (() -> Void) -> Void, second: (() -> Void) -> Void この制限を回避する必要がある場合は、いずれかのパラメータを `@esescaping` とマークしたり、パラメータの非エスケープ関数の 1 つを `withoutActuallyEscaping(_:do:)` を使ってエスケープ関数に一時的に変換します。メモリへのアクセス競合を回避する方法については、[Memory Safety\(メモリ安全性\)](../language-guide/memory-safety.md)を参照ください。 -> GRAMMAR OF A FUNCTION TYPE -> function-type → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt [function-type-argument-clause](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument-clause) `throws`opt `->` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) -> function-type-argument-clause → `(` `)` -> function-type-argument-clause → `(` [function-type-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument-list) `...`opt `)` -> function-type-argument-list → [function-type-argument](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument) \| [function-type-argument](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument) `,` [function-type-argument-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_function-type-argument-list) -> function-type-argument → [attributes](https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#grammar_attributes)opt `inout`opt [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) \| [argument-label](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_argument-label) [type-annotation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-annotation) -> argument-label → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#grammar_identifier) +> Grammar of a function type: +> +> *function-type* → *attributes*_?_ *function-type-argument-clause* **`async`**_?_ **`throws`**_?_ **`->`** *type* +> +> +> +> *function-type-argument-clause* → **`(`** **`)`** +> +> *function-type-argument-clause* → **`(`** *function-type-argument-list* **`...`**_?_ **`)`** +> +> +> +> *function-type-argument-list* → *function-type-argument* | *function-type-argument* **`,`** *function-type-argument-list* +> +> *function-type-argument* → *attributes*_?_ **`inout`**_?_ *type* | *argument-label* *type-annotation* +> +> *argument-label* → *identifier* ## 配列型\(Array Type\) Swift は、標準ライブラリで定義されている `Array` の次の糖衣構文\(シンタックスシュガー\)を提供しています。 -![配列型の糖衣構文](../assets/array_type.png) +```swift +[<#type#>] +``` つまり、次の 2 つの宣言は同等です: @@ -197,14 +233,17 @@ var array3D: [[[Int]]] = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] Swift 標準ライブラリの配列型の詳細については、[Arrays\(配列\)](../language-guide/collection-types.md#arrays)を参照ください。 -> GRAMMAR OF AN ARRAY TYPE -> array-type → `[` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `]` +> Grammar of an array type: +> +> *array-type* → **`[`** *type* **`]`** ## 辞書型\(Dictionary Type\) Swift は、標準ライブラリで定義されている `Dictionary` 型に次の糖衣構文\(シンタックスシュガー\)を提供しています。 -![辞書](../assets/dictionary_type.png) +```swift +[<#key type#>: <#value type#>] +``` つまり、次の 2 つの宣言は同等です: @@ -221,8 +260,9 @@ let someDictionary: Dictionary = ["Alex": 31, "Paul": 39] 標準ライブラリ `Dictionary` 型の詳細については、[Dictionaries\(辞書\)](../language-guide/collection-types.md#dictionaries)を参照ください。 -> GRAMMAR OF A DICTIONARY TYPE -> dictionary-type → `[` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `:` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `]` +> Grammar of a dictionary type: +> +> *dictionary-type* → **`[`** *type* **`:`** *type* **`]`** ## オプショナル型\(Optional Type\) @@ -250,8 +290,9 @@ optionalInteger! // 42 オプショナル型の使用方法を示す例を示した詳細については、[Optionals\(オプショナル\)](../language-guide/the-basics.md#optionals)を参照ください。 -> GRAMMAR OF AN OPTIONAL TYPE -> optional-type → [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `?` +> Grammar of an optional type: +> +> *optional-type* → *type* **`?`** ## 暗黙アンラップオプショナル型\(Implicitly Unwrapped Optional Type\) @@ -282,8 +323,9 @@ let implicitlyUnwrappedArray: [Int]! // OK 暗黙アンラップオプショナル型の詳細については、[Implicitly Unwrapped Optionals\(暗黙アンラップオプショナル\)](../language-guide/the-basics.md#implicitly-unwrapped-optionals)を参照ください。 -> GRAMMAR OF AN IMPLICITLY UNWRAPPED OPTIONAL TYPE -> implicitly-unwrapped-optional-type → [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `!` +> Grammar of an implicitly unwrapped optional type: +> +> *implicitly-unwrapped-optional-type* → *type* **`!`** ## プロトコル合成型\(Protocol Composition Type\) @@ -291,7 +333,9 @@ let implicitlyUnwrappedArray: [Int]! // OK プロトコル合成型の形式は次のとおりです: -![プロトコル合成型](../assets/protocol_compose_type.png) +```swift +<#Protocol 1#> & <#Protocol 2#> +``` プロトコル合成型を使用すると、型に準拠した各プロトコルを継承した新しい名前のプロトコルを明示的に定義することなく、型が複数のプロトコルの要件に準拠することを指定できます。例えば、`ProtocolA` と `ProtocolB` と `ProtocolC` を継承する新しいプロトコルを宣言する代わりに、プロトコル合成型の `ProtocolA & ProtocolB & ProtocolC` を使用できます。同様に、`SuperClass` のサブクラスと `ProtocolA` に準拠した新しいプロトコルを宣言する代わりに `SuperClass & ProtocolA` を使用することができ、`ProtocolA` に準拠できます。 @@ -308,9 +352,11 @@ typealias PQ = P & Q typealias PQR = PQ & Q & R ``` -> GRAMMAR OF A PROTOCOL COMPOSITION TYPE -> protocol-composition-type → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) `&` [protocol-composition-continuation](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_protocol-composition-continuation) -> protocol-composition-continuation → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) \| [protocol-composition-type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_protocol-composition-type) +> Grammar of a protocol composition type: +> +> *protocol-composition-type* → *type-identifier* **`&`** *protocol-composition-continuation* +> +> *protocol-composition-continuation* → *type-identifier* | *protocol-composition-type* ## Opaque 型\(Opaque Type\) @@ -320,16 +366,40 @@ Opaque 型は、関数または `subscript` の戻り値の型、またはプロ Opaque 型の形式は次のとおりです: -![Opaque 型](../assets/opaque_type.png) +```swift +some <#constraint#> +``` _constraint_ に入るのは、クラス型、プロトコル型、プロトコル合成型、または `Any` 型です。値としては、リスト内のプロトコルまたはプロトコル合成に準拠した型、またはリスト内のクラスを継承した型のインスタンスのみ使用できます。Opaque 型の値とやり取りするコードは、_constraint_ に定義された型のインターフェイスを通してのみ使用できます。 +コンパイル時に、Opaque 型の値は特定の具象型を持っています。そして、Swift は、最適化のためにその基礎となる型を使用することができます。しかし、利用時には、Opaque 型は、その基礎となる型に関する情報との間に超えることができない境界を形成します。 + プロトコルの宣言には Opaque 型を含めることはできません。また、クラスは、`final` ではないメソッドの戻り値の型として Opaque 型を使用することはできません。 戻り値の型として Opaque 型を使用する関数は、単一の型の値を返す必要があります。戻り値の型には、関数のジェネリックな型パラメータの一部を含めることができます。例えば、`someFunction()` は `T` 型または `Dictionary` 型の値を返すことができます。 -> GRAMMAR OF AN OPAQUE TYPE -> opaque-type → `some` [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) +> Grammar of an opaque type: +> +> *opaque-type* → **`some`** *type* + +## Box プロトコル型\(Boxed Protocol Type\) + +*Box プロトコル型*は、プロトコルまたはプロトコル合成に準拠する型を定義し、その準拠する型がプログラムの実行中に動的に変わる能力を持ちます。 + +Box プロトコル型の形式は次のとおりです: + +```swift +any <#constraint#> +``` + +*制約*は、プロトコル型、プロトコル合成型、プロトコル型のメタタイプ、またはプロトコル合成型のメタタイプです。 + +実行時に、Box プロトコル型のインスタンスは、制約を満たす任意の型の値を含むことができます。この動作は、コンパイル時に既知の特定の準拠型が存在する Opaque 型の動作とは対照的です。Box プロトコル型を扱う際に使用される追加の間接層は、`boxing` と呼ばれます。`boxing` は通常、ストレージのための別のメモリ割り当てと、アクセスのための追加の間接層を必要とし、実行時にパフォーマンスコストを発生させます。 +`Any` 型や `AnyObject` 型に `any` を適用しても、これらの型はすでに Box プロトコル型であるため、何の効果もありません。 + +> Grammar of a boxed protocol type: +> +> *boxed-protocol-type* → **`any`** *type* ## Metatype 型\(Metatype Type\) @@ -375,8 +445,9 @@ let metatype: AnotherSubClass.Type = AnotherSubClass.self let anotherInstance = metatype.init(string: "some string") ``` -> GRAMMAR OF A METATYPE TYPE -> metatype-type → [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `.` `Type` \| [type](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type) `.` `Protocol` +> Grammar of a metatype type: +> +> *metatype-type* → *type* **`.`** **`Type`** | *type* **`.`** **`Protocol`** ## Any 型\(Any Type\) @@ -404,8 +475,9 @@ if let first = mixed.first as? String { `AnyObject` プロトコルは `Any` 型と似ています。全てのクラスは暗黙的に `AnyObject` に準拠しています。言語によって定義されているものとは異なり、`AnyObject` は標準ライブラリで定義されています。詳細については、[Class-Only Protocols\(クラス専用プロトコル\)](../language-guide/protocols.md#class-only-protocols)と [AnyObject](https://developer.apple.com/documentation/swift/anyobject)を参照ください。 -> GRAMMAR OF AN ANY TYPE -> any-type → `Any` +> Grammar of an Any type: +> +> *any-type* → **`Any`** ## Self 型\(Self Type\) @@ -446,8 +518,9 @@ prInt(type(of: z.f())) `Self` 型は、標準ライブラリ[type\(of:\)](https://developer.apple.com/documentation/swift/2885064-type)関数と同じ型を指します。現在の型のメンバにアクセスするめに `Self.SomeStaticMember` を書くことは、`type(of: self).someStaticMember` を書くのと同じです。 -> GRAMMAR OF A SELF TYPE -> self-type → `Self` +> Grammar of a Self type: +> +> *self-type* → **`Self`** ## 型継承句\(Type Inheritance Clause\) @@ -459,9 +532,11 @@ _型継承句_は、名前付き型がどのクラスを継承しているか、 列挙型の型継承句は、プロトコルのリスト、または列挙ケースに Raw Value を割り当てる場合は、それらの Raw Value の型を特定する単一の名前付き型を継承することができます。型継承句を使用して Raw Value 型を指定する列挙型の定義の例については、[Raw Values](../language-guide/enumerations.md#raw-values)を参照ください。 -> GRAMMAR OF A TYPE INHERITANCE CLAUSE -> type-inheritance-clause → `:` [type-inheritance-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-list) -> type-inheritance-list → [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) \| [type-identifier](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-identifier) `,` [type-inheritance-list](https://docs.swift.org/swift-book/ReferenceManual/Types.html#grammar_type-inheritance-list) +> Grammar of a type inheritance clause: +> +> *type-inheritance-clause* → **`:`** *type-inheritance-list* +> +> *type-inheritance-list* → *attributes*_?_ *type-identifier* | *attributes*_?_ *type-identifier* **`,`** *type-inheritance-list* ## 型推論\(Type Inference\) diff --git a/welcome-to-swift/a-swift-tour.md b/welcome-to-swift/a-swift-tour.md index 24225c54..63a5bdd2 100644 --- a/welcome-to-swift/a-swift-tour.md +++ b/welcome-to-swift/a-swift-tour.md @@ -738,10 +738,10 @@ print(7.simpleDescription) > Experiment > `absoluteValue` プロパティを `Double` に追加する `extension` を書いてみましょう。 -プロトコルの名前は、他の名前が付いた型と同じように使用することができます。例えば、同じ 1 つのプロトコルに準拠した異なる型のオブジェクトのコレクションを作成することができます。プロトコル型の値をそのまま扱っている場合、プロトコルの外側で定義されたメソッドを使用することはできません。 +プロトコルの名前は、他の名前が付いた型と同じように使用することができます。例えば、同じ 1 つのプロトコルに準拠した異なる型のオブジェクトのコレクションを作成することができます。Box プロトコル型の値をそのまま扱っている場合、プロトコルの外側で定義されたメソッドを使用することはできません。 ```swift -let protocolValue: ExampleProtocol = a +let protocolValue: any ExampleProtocol = a print(protocolValue.simpleDescription) // A very simple class. Now 100% adjusted. が出力されます。 // print(protocolValue.anotherProperty) // エラーを確認したい場合はコメントアウトを外しましょう