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 → protocol-declaration declaration → initializer-declaration declaration → deinitializer-declaration declaration → extension-declaration declaration → subscript-declaration declaration → operator-declaration declaration → precedence-group-declaration declarations → declaration declarationsopt
main
属性、NSApplicationMain
属性、UIApplicationMain
属性、main.swift
ファイル、またはトップレベルの実行可能コードを含むファイルです。import
キーワードとそれに続くモジュール名で構成されます:GRAMMAR OF AN IMPORT DECLARATION import-declaration → attributesoptimport
import-kindopt import-path import-kind →typealias
|struct
|class
|enum
|protocol
|let
|var
|func
import-path → import-path-identifier | import-path-identifier.
import-path import-path-identifier → identifier | operator
let
キーワードを使用して宣言され、形式は次のとおりです。firstNumber
は値 10
の名前付き定数で、secondNumber
は 42
の名前付き定数です。両方の定数は独立して使用できます。static
修飾子をマークします。クラスの定数型プロパティは常に暗黙的に final
です。サブクラスによるオーバーライドを許可または禁止するために、class
または final
修飾子をマークすることはできません。型プロパティは、Type Properties(型プロパティ)で説明されています。GRAMMAR OF A CONSTANT DECLARATION constant-declaration → attributesopt declaration-modifiersoptlet
pattern-initializer-list pattern-initializer-list → pattern-initializer | pattern-initializer,
pattern-initializer-list pattern-initializer → pattern initializeropt initializer →=
expression
var
キーワードを使用して宣言されます。: type
)を含める必要があります。newValue
です。willSet
や didSet
オブザーバと一緒に宣言することもできます。オブザーバで宣言された格納変数またはプロパティの形式は次のとおりです:willSet
および didSet
オブザーバは、変数またはプロパティの値が設定されるときに、その値を監視(そして適切に対応する)方法を提供します。変数またはプロパティが最初に初期化される場合は、オブザーバは呼び出されません。代わりに、それらは初期化以外で値が設定されている場合にのみ呼び出されます。willSet
オブザーバは、変数またはプロパティの値が設定される直前に呼び出されます。新しい値が定数として willSet
オブザーバに渡されるため、 willSet
句の実装では変更できません。didSet
オブザーバは、新しい値が設定された直後に呼び出されます。willSet
オブザーバとは対照的に、それにアクセスする必要がある場合は、変数またはプロパティの古い値が didSet
オブザーバーに渡されます。つまり、自身の didSet
オブザーバ句内で変数またはプロパティに値を割り当てた場合、直前で設定して willSet
オブザーバに渡された値を置き換えます。willSet
および didSet
句内の setter name とそれを囲む括弧は省略可能です。setter name を指定した場合は、willSet
と didSet
オブザーバのパラメータ名として使用されます。setter name を指定しない場合は、willSet
オブザーバのデフォルトのパラメータ名が newValue
で、didSet
オブザーバのデフォルトのパラメータ名は oldValue
です。didSet
句は、willSet
句を指定した場合は省略可能です。同様に、didSet
句を指定するときは、willSet
句は省略可能です。didSet
オブザーバの本文が古い値を参照する場合、get はオブザーバの前に呼び出され、古い値を使用できます。それ以外の場合は、スーパークラスの get を呼び出さずに新しい値が格納されます。下記の例は、スーパークラスで定義され、オブザーバを追加するためにそのサブクラスでオーバーライドされた計算プロパティを示しています:static
修飾子でマークします。サブクラスがスーパークラスの実装をオーバーライドできるようにするには、代わりに class
修飾子を使用して型計算プロパティを宣言することができます。型プロパティは、Type Properties(型プロパティ)で説明されています。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 initializeropt willSet-didSet-block variable-declaration-head → attributesopt declaration-modifiersoptvar
variable-name → identifier getter-setter-block → code-block getter-setter-block →{
getter-clause setter-clauseopt}
getter-setter-block →{
setter-clause getter-clause}
getter-clause → attributesopt mutation-modifieroptget
code-block setter-clause → attributesopt mutation-modifieroptset
setter-nameopt code-block setter-name →(
identifier)
getter-setter-keyword-block →{
getter-keyword-clause setter-keyword-clauseopt}
getter-setter-keyword-block →{
setter-keyword-clause getter-keyword-clause}
getter-keyword-clause → attributesopt mutation-modifieroptget
setter-keyword-clause → attributesopt mutation-modifieroptset
willSet-didSet-block →{
willSet-clause didSet-clauseopt}
willSet-didSet-block →{
didSet-clause willSet-clauseopt}
willSet-clause → attributesoptwillSet
setter-nameopt code-block didSet-clause → attributesoptdidSet
setter-nameopt code-block
typealias
キーワードを使用して宣言され、形式は次のとおりです:Diccionario
というタイプエイリアスは、Dictionary
と同じジェネリックパラメータと制約を持ちます。sum
関数は関連型を T.Element
ではなく T.Iterator.Element
として参照する必要があります。GRAMMAR OF A TYPE ALIAS DECLARATION typealias-declaration → attributesopt access-level-modifieropttypealias
typealias-name generic-parameter-clauseopt typealias-assignment typealias-name → identifier typealias-assignment →=
type
func
キーワードを使用して宣言され、形式は次のとおりです:Void
の場合は、次のように戻り値の型を省略できます:inout
を書くと、その関数の範囲内でパラメータを変更できます。in-out パラメータについては、下記のIn-Out Parameters(In-Out パラメータ)で詳細に説明されています。Void
やケースを持たない Never
のような列挙型ではない場合にのみ使用できます。_
)を付けると、引数ラベルが省略されます。関数呼び出しまたはメソッド呼び出し時は、対応する引数に、ラベルを付けてはなりません。_
)パラメータは明示的に無視され、関数の本文内でアクセスすることはできません。...
)を続くパラメータは、可変長パラメータとして解釈されます。可変長パラメータのすぐ後に続くパラメータには、引数ラベルが必要です。関数は複数の可変長パラメータを持つことができます。可変長パラメータは、型名の要素の配列として扱われます。例えば、可変長パラメータ Int...
は [Int]
として扱われます。可変長パラメータを使用する例については、Variadic Parameters(可変長パラメータ)を参照ください。=
)パラメータと型の後に式を伴うパラメータは、指定された式をデフォルト値として解釈します。指定された式は、関数が呼び出された時に評価されます。関数呼び出し時にパラメータを省略すると、デフォルト値が代わりに使用されます。self
を変更する列挙型または構造体のメソッドは、mutating
修飾子でマークされていなければなりません。override
修飾子でマークされている必要があります。これは、override
修飾子なしでメソッドをオーバーライド、逆にスーパークラスメソッドをオーバーライドしないメソッドで override
修飾子を使用するとコンパイルエラーになります。static
修飾子、またはクラスの static
または class
修飾子のいずれかでマークされている必要があります。class
修飾子でマークされたクラス型メソッドは、サブクラスでオーバーライドできます。class final
または static
でマークされたクラス型メソッドはオーバーライドできません。dynamicallyCall(withArguments:)
メソッドまたは dynamicallyCall(withKeywordArguments:)
メソッドを定義することによって、または下記で説明されているように、call-as-function メソッドを定義することによって、関数呼び出し構文をサポートできます。型が call-as-function メソッドと dynamicCallable
属性のメソッドの両方を定義している場合、コンパイラはどちらの方法も使用できる状況では、call-as-function メソッドを選びます。callAsFunction()
、または callAsFunction(
で始まり、ラベル有りまたはなしの引数を付けた別の名前(例えば、callAsFunction(_:_:)
、callAsFunction(something:)
も有効です。dynamicCallable
属性のメソッドは、型システムにどのくらいの情報を与え、実行時にどのくらい動的な動作が可能かの間で異なるトレードオフがあります。call-as-function メソッドを宣言すると、引数の数、および各引数の型とラベルを指定します。dynamicCallable
属性のメソッドは、引数の配列を保持するために使用される型のみを指定できます。dynamicCallable
属性のメソッドを定義することは、任意のコンテキスト内で関数呼び出し以外の関数のようにその型のインスタンスを使用してはいけません。例えば:throws
キーワードでマークされている必要があります。これらの関数およびメソッドは、_スロー関数_および_スローメソッド_と呼ばれます。形式は次のとおりです:try
または try!
式で囲まれていなければなりません(つまり、try
または try!
演算子のスコープ内)。throws
キーワードは関数の型の一部で、非スロー関数はスロー関数のサブタイプです。その結果、スロー関数が期待されているコンテキストで非スロー関数を使用することができます。rethrows
キーワードを使うことができます。これらの関数およびメソッドは、_再スロー関数_および_再スローメソッド_と呼ばれます。再スロー関数と再スローメソッドには、少なくとも 1 つのエラーをスローする関数のパラメータが必要です。catch
句内でのみ throw
文を含めることができます。これにより、do-catch
文内でスロー関数を呼び出し、catch
句で別のエラーを投げてエラーを処理できます。さらに、catch
句は、再スロー関数のスローパラメータの 1 つからスローされたエラーのみを処理しなければなりません。例えば、次の例では、catch
句は alwaysthrows()
からスローされたエラーを処理しているため、無効です:async
キーワードでマークされている必要があります。これらの関数とメソッドは、_非同期関数_と_非同期メソッド_と呼ばれています。形式は次のとおりです:await
でラップされていなければなりません。async
キーワードは関数の型の一部で、同期関数は非同期関数のサブタイプのため、非同期関数が期待されるコンテキストで同期関数を使用できます。例えば、同期メソッドを使用して非同期メソッドをオーバーライドでき、同期メソッドは非同期メソッドのプロトコル要件を満たすことができます。Never
を定義しています。戻り値のない型を持つ関数とメソッドは、_ノーリターン_と呼ばれます。ノーリターン関数とノーリターンメソッドは、回復不能なエラーを引き起こすか、または無期限に続く一連のタスクを始めます。つまり、呼び出すとそれ以降のコードが決して実行されないことを意味します。スロー関数や再スロー関数では、ノーリターンでも、適切な catch
句を使ってプログラムの制御を転送できます。GRAMMAR OF A FUNCTION DECLARATION function-declaration → function-head function-name generic-parameter-clauseopt function-signaturegeneric-where-clauseopt function-bodyopt function-head → attributesopt declaration-modifiersoptfunc
function-name → identifier | operator function-signature → parameter-clauseasync
optthrows
opt function-resultopt function-signature → parameter-clauseasync
optrethrows
function-resultopt function-result →->
attributesopt type function-body → code-block parameter-clause →(
)
|(
parameter-list)
parameter-list → parameter | parameter,
parameter-list parameter → external-parameter-nameopt local-parameter-name type-annotation default-argument-clauseopt parameter → external-parameter-nameopt local-parameter-name type-annotation parameter → external-parameter-nameopt local-parameter-name type-annotation...
external-parameter-name → identifier local-parameter-name → identifier default-argument-clause →=
expression
enum
キーワードを使用して宣言されます。いずれかの形式を使用して宣言された列挙型の本文には、_列挙ケース_と呼ばれる 0 個以上の値と、計算プロパティ、インスタンスメソッド、型メソッド、イニシャライザ、タイプエイリアス、さらには他の列挙型、構造体、クラス、アクター宣言を含めることができます。列挙型宣言には、デイニシャライザまたはプロトコル宣言を含めることはできません。case
キーワードと、それに続く 1 つ以上の列挙ケースで構成され、カンマ(,
)で区切られます。各ケースの名前は一意にする必要があります。各ケースでは、特定の型の値を格納するように指定することもできます。これらの型は、ケースの名前の直後にある、関連値 のタプルで指定できます。indirect
修飾子でマークします。indirect
ケースには、関連値が必要です。indirect
を有効にするには、列挙型全体に indirect
修飾子を付けます。これは、列挙型を indirect
修飾子でマークする必要があるケースが多く含まれている場合に便利です。indirect
修飾子でマークされた列挙型には、関連値を持つケースと関連値を持たないケースが混在している可能性があります。しかし、ケースに indirect
修飾子を付けることはできません。case
キーワードと、それに続く 1 つ以上の列挙ケースで構成され、カンマ(,
)で区切られます。最初の形式のケースとは異なり、各ケースには、同じ基本型の Raw Value と呼ばれる基になる値があります。これらの値の型は Raw Value 型 で指定され、整数、浮動小数点数、文字列、または単一文字の必要があります。特に、Raw Value 型は、Equatable
プロトコルおよび次のいずれかのプロトコルに準拠する必要があります: 整数リテラルの場合は ExpressibleByIntegerLiteral
、浮動小数点リテラルの場合は ExpressibleByFloatLiteral
、任意の数の文字を含む文字列リテラルの場合は ExpressibleByStringLiteral
、文字列の場合は ExpressibleByUnicodeScalarLiteral
、1 文字のみを含むリテラルの場合は ExpressibleByExtendedGraphemeClusterLiteral
です。各ケースには一意の名前と一意の Raw Value が割り当てられている必要があります。Int
が指定されているものの、ケースに値が割り当てられていない場合、0
、1
、2
などの値が暗黙的に割り当てられます。値が割り当てられていない各ケースには、前のケースの Raw Value から自動的にインクリメントされた Raw Value が暗黙的に割り当てられます。ExampleEnum.a
の Raw Value は 0
で、ExampleEnum.b
は 1
です。また、ExampleEnum.c
の値は明示的に 5
に設定されているため、ExampleEnum.d
の値は自動的に 5
からインクリメントされます。したがって、6
です。GamePlayMode.cooperative
の Raw Value は "cooperative"
、GamePlayMode.individual
の Raw Value は "individual"
、GamePlayMode.competitive
の Raw Value は "competitive"
です。RawRepresentable
プロトコルに暗黙的に準拠しています。その結果、rawValue
プロパティと、失敗可能イニシャライザ init?(rawValue: RawValue)
を持ちます。ExampleEnum.b.rawValue
のように、rawValue
プロパティを使用して、列挙型の Raw Value にアクセスできます。また、ExampleEnum(rawValue: 5)
のように、失敗可能イニシャライザを呼び出すことにより、Raw Value を使用して対応するケースを探すことができます。オプショナルの列挙ケースを返します。詳細および Raw Value 型のケースの例については、Raw Valuesを参照ください。EnumerationType.enumerationCase
と同様に、ドット(.
)構文を使用します。列挙の型を推論できる場合は、Enumeration Syntax(列挙型構文)とImplicit Member Expression(暗黙メンバ式)で説明されているように、型名を省略することができます(ドットは必要です)。switch
文を使用します。列挙型は、Enumeration Case Pattern(列挙ケースパターン)で説明されているように、switch
文のケースブロックの列挙ケースのパターンに対してパターンマッチングできます。GRAMMAR OF AN ENUMERATION DECLARATION enum-declaration → attributesopt access-level-modifieropt union-style-enum enum-declaration → attributesopt access-level-modifieropt raw-value-style-enum union-style-enum →indirect
optenum
enum-name generic-parameter-clauseopt type-inheritance-clauseopt generic-where-clauseopt{
union-style-enum-membersopt}
union-style-enum-members → union-style-enum-member union-style-enum-membersopt union-style-enum-member → declaration | union-style-enum-case-clause | compiler-control-statement union-style-enum-case-clause → attributesoptindirect
optcase
union-style-enum-case-list union-style-enum-case-list → union-style-enum-case | union-style-enum-case,
union-style-enum-case-list union-style-enum-case → enum-case-name tuple-typeopt enum-name → identifier enum-case-name → identifier raw-value-style-enum →enum
enum-name generic-parameter-clauseopt type-inheritance-clause generic-where-clauseopt{
raw-value-style-enum-members}
raw-value-style-enum-members → raw-value-style-enum-member raw-value-style-enum-membersopt raw-value-style-enum-member → declaration | raw-value-style-enum-case-clause | compiler-control-statement raw-value-style-enum-case-clause → attributesoptcase
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-assignmentopt raw-value-assignment →=
raw-value-literal raw-value-literal → numeric-literal | static-string-literal | boolean-literal
struct
キーワードを使用して宣言され、形式は次のとおりです。GRAMMAR OF A STRUCTURE DECLARATION struct-declaration → attributesopt access-level-modifieroptstruct
struct-name generic-parameter-clauseopt type-inheritance-clauseopt generic-where-clauseopt struct-body struct-name → identifier struct-body →{
struct-membersopt}
struct-members → struct-member struct-membersopt struct-member → declaration | compiler-control-statement
class
キーワードを使用して宣言され、形式は次のとおりです。:
)の後の最初に表示され、その後に adopted protocols が続きます。ジェネリッククラスは他のジェネリッククラスと非ジェネリッククラスを継承できますが、非ジェネリッククラスは他の非ジェネリッククラスのみ継承できます。コロンの後にジェネリックなスーパークラスの名前を書くときは、ジェネリックパラメータを含めたそのジェネリッククラスの全てを含める必要があります。override
修飾子でマークされる必要があります。required
修飾子をマークします。そのイニシャライザのサブクラスの実装にも、required
修飾子でマークする必要があります。GRAMMAR OF A CLASS DECLARATION class-declaration → attributesopt access-level-modifieroptfinal
optclass
class-name generic-parameter-clauseopt type-inheritance-clauseopt generic-where-clauseopt class-body class-declaration → attributesoptfinal
access-level-modifieroptclass
class-name generic-parameter-clauseopt type-inheritance-clauseopt generic-where-clauseopt class-body class-name → identifier class-body →{
class-membersopt}
class-members → class-member class-membersopt class-member → declaration | compiler-control-statement
actor
キーワードを使用して宣言され、形式は次のとおりです。@objc
属性でマークされたアクターは、暗黙的に NSObjectProtocol
プロトコルに準拠し、NSObject
のサブタイプとして Objective-C ランタイムに公開されます。await
をマークする必要があります。key path は、アクターの isolated メンバを参照することはできません。アクターの isolated 格納プロパティは、同期関数に in-out パラメータとして渡すことができますが、非同期関数には渡すことができません。nonisolated
キーワードでマークされている非隔離(nonisolated) メンバを持つこともできます。nonisolated メンバは、アクターの外部のコードのように実行されます。アクターの isolated な状態と同期的にやり取りすることはできませんが、呼び出し元は、使用時に await
マークを付けません。@objc
属性でマークできます。GRAMMAR OF A ACTOR DECLARATION actor-declaration → attributesopt access-level-modifieroptactor
actor-name generic-parameter-clauseopt type-inheritance-clauseopt generic-where-clauseopt actor-body actor-name → identifier actor-body →{
actor-membersopt}
actor-members → actor-member actor-membersopt actor-member → declaration | compiler-control-statement
protocol
キーワードを使用してグローバルスコープで宣言され、形式は次のとおりです。NOTE Protocol Composition Type(プロトコル合成型)およびProtocol Composition(プロトコル合成)で説明されているように、プロトコル合成型を使用して、複数のプロトコルの要件を集約することもできます。
optional
修飾子をマークして、準拠する型の実装を省略することもできます。optional
修飾子は、objc
属性でマークされているメンバにのみ適用でき、objc
属性でマークされているプロトコルのメンバにのみ適用できます。その結果、クラス型のみが、オプショナルのメンバ要件を含むプロトコルに準拠できます。optional
修飾子の使用方法の詳細と、オプショナルのプロトコルメンバにアクセスする方法のガイダンス(例えば、準拠する型がそれらを実装しているかどうかわからない場合など)については、Optional Protocol Requirements(オプショナルのプロトコル要件)を参照ください。Self
型の get-only の型変数のプロトコル要件を満たし、関連値のある列挙ケースは、パラメータとその引数ラベルがケース名と一致する Self
を返す関数のプロトコル要件を満たします。例えば::
)の後の inherited protocols リストに AnyObject
プロトコルを含めます。例えば、次のプロトコルはクラス型でのみで準拠できます。AnyObject
でマークされたプロトコルを継承するプロトコルは、クラス型でのみ準拠できます。NOTE プロトコルがobjc
属性でマークされている場合、AnyObject
はそのプロトコルに暗黙的に準拠します。AnyObject
を明示的にマークする必要はありません。
GRAMMAR OF A PROTOCOL DECLARATION protocol-declaration → attributesopt access-level-modifieroptprotocol
protocol-name type-inheritance-clauseopt generic-where-clauseopt protocol-body protocol-name → identifier protocol-body →{
protocol-membersopt}
protocol-members → protocol-member protocol-membersopt 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
get
キーワードと set
キーワードの両方が含まれている場合、準拠する型は、格納変数プロパティ、または読み取りと書き込みの両方が可能な計算プロパティ(つまり、get と set の両方を実装するプロパティ)を使用して実装できます。ただし、そのプロパティ宣言は、定数プロパティまたは読み取り専用の計算プロパティとして実装することはできません。プロパティ宣言に get
キーワードのみが含まれている場合は、任意の種類のプロパティを実装できます。プロトコルのプロパティ要件を実装した例については、Property Requirements(プロパティ要件)を参照ください。static
キーワードでプロパティ宣言をマークします。プロトコルに準拠する構造体と列挙型は、static
キーワードを使用してプロパティを宣言し、プロトコルに準拠するクラスは、static
または class
キーワードを使用してプロパティを宣言します。構造体、列挙型、またはクラスにプロトコルの準拠を追加する extension は、拡張する型と同じキーワードを使用します。型プロパティ要件のデフォルト実装を提供する extension は、static
キーワードを使用します。GRAMMAR OF A PROTOCOL PROPERTY DECLARATION protocol-property-declaration → variable-declaration-head variable-name type-annotation getter-setter-keyword-block
static
修飾子を使用してメソッド宣言をマークします。プロトコルに準拠する構造体と列挙型は、static
キーワードを使用してメソッドを宣言し、プロトコルに準拠するクラスは、static
または class
キーワードを使用してメソッドを宣言します。構造体、列挙型、またはクラスにプロトコルの準拠を追加する extension は、拡張する型と同じキーワードを使用します。型メソッド要件のデフォルト実装を提供する extension は、static
キーワードを使用します。GRAMMAR OF A PROTOCOL METHOD DECLARATION protocol-method-declaration → function-head function-name generic-parameter-clauseopt function-signature generic-where-clauseopt
init!
形式の失敗可能イニシャライザを実装することにより、プロトコルの失敗しないイニシャライザの要件を満たすことができます。準拠する型は、任意のイニシャライザを実装することにより、プロトコルの失敗可能イニシャライザの要件を満たすことができます。final
修飾子でマークされていない場合、イニシャライザは required
修飾子をマークする必要があります。GRAMMAR OF A PROTOCOL INITIALIZER DECLARATION protocol-initializer-declaration → initializer-head generic-parameter-clauseopt parameter-clausethrows
opt generic-where-clauseopt protocol-initializer-declaration → initializer-head generic-parameter-clauseopt parameter-clauserethrows
generic-where-clauseopt
get
キーワードと set
キーワードの両方が含まれている場合、準拠する型は get 句と set 句の両方を実装する必要があります。subscript 宣言に get
キーワードのみが含まれている場合、準拠する型は_少なくとも_ get 句を実装する必要があり、任意で set 句を実装できます。static
修飾子を使用して subscript 宣言をマークします。プロトコルに準拠する構造体と列挙型は、static
キーワードを使用して subscript を宣言し、プロトコルに準拠するクラスは、static
または class
キーワードを使用して subscript を宣言します。構造体、列挙型、またはクラスにプロトコルの準拠を追加する extension は、拡張する型と同じキーワードを使用します。静的 subscript 要件のデフォルト実装を提供する extension は、static
キーワードを使用します。GRAMMAR OF A PROTOCOL SUBSCRIPT DECLARATION protocol-subscript-declaration → subscript-head subscript-result generic-where-clauseopt getter-setter-keyword-block
associatedtype
キーワードを使用して関連型を宣言します。関連型は、プロトコルの宣言の一部として使用される型の別名を提供します。関連型は、ジェネリックパラメータ句の型パラメータに似ていますが、宣言されているプロトコルでは Self
に関連付けられています。このコンテキストでは、Self
はプロトコルに準拠する最終的な型を指します。詳細と例については、Associated Types(関連型)を参照ください。where
句を使用して、関連型を再宣言せずに、別のプロトコルから継承された関連型に制約を追加できます。例えば、下記の SubProtocol
の宣言は同等です:GRAMMAR OF A PROTOCOL ASSOCIATED TYPE DECLARATION protocol-associated-type-declaration → attributesopt access-level-modifieroptassociatedtype
typealias-name type-inheritance-clauseopt typealias-assignmentopt generic-where-clauseopt
init
キーワードを使用して宣言され、2 つの基本的な形式があります。convenience
修飾子を使用してイニシャライザ宣言をマークします。required
修飾子をマークすることができます。その場合、サブクラスのイニシャライザの実装にも、required
修飾子をマークする必要があります。override
修飾子でマークする必要があります。NOTErequired
修飾子を使用してイニシャライザをマークする場合、サブクラスでそのイニシャライザをオーバーライドするときに、override
修飾子をマークする必要はありません。
throws
または rethrows
キーワードを使用して、適切な動作を示します。