<>
)で囲まれており、形式は次のとおりです。T
、U
、V
、Key
、Value
など)。関数またはイニシャライザのシグネチャを含む型や関数の残りの部分から型パラメータ(およびその関連型の全ての型)にアクセスできます。T: Comparable
は、型パラメータ T
に代入された任意の型パラメータが Comparable
プロトコルに準拠しなければならないことを示しています。Int
と Double
は、どちらも Comparable
プロトコルに準拠しているため、この関数はどちらの型の引数も受け入れます。ジェネリック型とは対照的に、ジェネリック関数やイニシャライザを使用するときはジェネリックパラメータ句を指定しません。型引数は、関数またはイニシャライザに渡された引数の型から推論されます。{
)の直前にジェネリック where
句を含むことによって、型パラメータとその関連型に追加要件を指定できます。ジェネリック where
句は、where
キーワードで構成され、その後に 1 つ以上の要件のカンマ区切りのリストが続きます。where
句の requirements は、型パラメータがクラスを継承するか、プロトコルまたはプロトコル合成に準拠することを指定します。ジェネリック where
句は型パラメータのシンプルな制約を表現するための糖衣構文(シンタックスシュガー)を提供しますが(例えば、<T: Comparable>
は <T> where T: Comparable
などと同等)、それを使用して複雑な制約を型パラメータや関連型に提供することもできます。例えば、プロトコルに準拠するために、関連型の型パラメータを制限することができます。<S: Sequence> where S.Iterator.Element: Equatable
は、S
が Sequence
プロトコルに準拠し、関連型 S.Iterator.Element
が Equatable
プロトコルに準拠することを指定します。この制約は、シーケンスの各要素が Equatable
だということを保証します。==
演算子を使用して、2 つの型が同じという要件を指定することもできます。例えば、<S1: Sequence, S2: Sequence> where S1.Iterator.Element == S2.Iterator.Element
は S1
と S2
が Sequence
プロトコルに準拠し、両方のシーケンスの要素が同じ型でなければならない制約を表現します。where
句は、型パラメータを含む宣言の一部として、または型パラメータを含む宣言の中にネストされている宣言の一部として使用することができます。ネストされた宣言のジェネリック where
句は、その宣言をラップしている宣言の型パラメータを参照できます。ただし、その要件は、where
句が書かれている宣言にのみ適用されます。where
句がある場合、両方の句の要件が組み合わされます。下記の例では、startSwithZero()
は、Element
が SomeProtocol
と Numeric
の両方に準拠している場合にのみ使用できます。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
<>
)で囲まれており、形式は次のとおりです。Dictionary
型の具象型バージョン、Dictionary<String, Int>
は、ジェネリックパラメータ Key: Hashable
と Value
を具象型の String
と Int
に置き換えることで形成されます。各型引数は、それが置き換えるジェネリックパラメータの全ての制約を満たす必要があります。上記の例では、Key
型パラメータは Hashable
プロトコルに準拠するように制約され、したがって String
も Hashable
プロトコルに準拠していなければなりません。Array<Element>
の型パラメータ Element
を配列 Array<Int>
に置き換えることができ、要素が整数の配列を形成することができます。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