Swift 6.0 beta 日本語化計画 : Swift 6.0 beta
汎用パラメータと引数
この章では、汎用型、関数、およびイニシャライザのパラメータと引数について説明します。汎用型、関数、サブスクリプト、またはイニシャライザを宣言するときは、汎用型、関数、またはイニシャライザが操作できる型パラメータを指定して下さい。これらの型パラメータは、汎用型のインスタンスが作成されるか、汎用関数やイニシャライザが呼び出されたときに、実際の具体的な型の引数で置き換えられるプレースホルダとして機能します。
Swift の汎用の概要については、ジェネリック(汎用) を参照してください。
汎用パラメータ句 は、汎用型や関数のパラメータに関連するすべての制約と要件に沿って、それらの型パラメータを指定します。汎用パラメータ句は、山括弧 (<>) で囲まれ、以下の形式です。
<<#generic parameter list#>>
汎用パラメータリスト は、コンマで区切られた汎用パラメータのリストであり、それぞれの形式は以下のとおりです。
<#type parameter#>: <#constraint#>
汎用パラメータは、オプションの 制約 が続く 型パラメータ で構成されています。型パラメータ は、単にプレースホルダ型の名前です (例えば、T,U,V,Key,Value などなど)。型の残り、関数やイニシャライザ宣言で関数やイニシャライザの署名に含められた、型パラメータへのアクセス (およびそれらに関連する型のいずれか) があります。
制約(constraint) は、型パラメータが特定のクラスから継承またはプロトコルやプロトコル構成に準拠していることを指定します。例えば、以下の汎用関数で、汎用パラメータ T: Comparable は、型パラメータ T の代わりに任意の型引数が、Comparable プロトコルに準拠しなければならないことを示します。
Int と Double は、例えば、両方とも Comparable プロトコルに準拠するため、この関数は、どちらの型の引数でも受け入れます。汎用関数またはイニシャライザを使用した場合、汎用型とは対照的に、汎用引数の句を指定しないでください。代わりに型引数が、関数またはイニシャライザに渡された引数の型から推測されます。
型パラメータとその関連型の追加要件を指定するには、型または関数の本体の開始の中括弧の直前に汎用の where 句を含めることでできます。汎用の where 句は、where キーワードと、カンマで区切られた1つ以上の 要件 のリストで構成されます。
where <#requirements#>
汎用の where 句での 要件 は、型パラメータがクラスから継承するか、プロトコルまたはプロトコル構成に準拠していることを指定します。汎用の where 句は型パラメータで単純な制約を表すためのシンタックスシュガーを提供し (例えば、<T: Comparable> は、 <T> where T: Comparable と同等です、など)、型パラメータとその関連する型への、より複雑な制約を提供するためにそれを使用できます。たとえば、プロトコルに準拠するように型パラメータの関連型を制約できます。たとえば、<S: Sequence> where S.Iterator.Element: Equatable は、S が Sequence プロトコルに準拠し、関連する型 S.Iterator.Element が Equatable プロトコルに準拠している事を指定します。この制約は、sequence の各要素が equatable であることを保証します。
また、== 演算子を使用して、2つの型が同一である要件も指定できます。たとえば、<S1: Sequence, S2: Sequence> where S1.Iterator.Element == S2.Iterator.Elementt は、S1 および S2 が Sequence プロトコルに準拠しているという制約を表し、また両方のシーケンスの要素が同じ型でなければならないという制約を表します。
型パラメータの代わりの全ての型の引数は、型パラメータ上のすべての制約と要件を満たしていなければなりません。
汎用 where 句は、型パラメータを含む宣言の一部として、または型パラメータを含む宣言内に入れ子にされた宣言の一部として表示できます。入れ子にされた宣言の汎用 where 句は、それを囲む宣言の型パラメータも参照できます。ただし、その where 句の要件は、それが記述されている宣言にのみ適用されます。
囲んでいる宣言に where 句もある場合は、両方の句の要件が組み合わされます。以下の例では、startsWithZero( ) は、Element が SomeProtocol と Numeric の両方に準拠している場合にのみ使用できます。
型パラメータに異なる制約、要件、またはその両方を指定することによって、汎用関数またはイニシャライザをオーバーロードできます。オーバーロードされた汎用関数またはイニシャライザを呼び出す場合、コンパイラはこれらの制約を使用して、どのオーバーロードされた関数またはイニシャライザを呼び出すべきかを解決します。
汎用 where 句の詳細についてと、汎用関数の宣言の1つの例については、汎用の Where 句 を参照してください。
汎用引数句 は、汎用型の型引数を指定します。汎用引数句は山括弧 (<>) に囲まれた、以下の形式です。
<<#generic argument list#>>
汎用引数リスト は、型引数のカンマで区切られたリストです。型引数 は汎用型の汎用パラメータ句に対応する型パラメータを置き換える実際の具体的な型の名前です。結果は、その汎用型の特殊なバージョンです。以下の例は、Swift 標準ライブラリの、汎用辞書型の単純なバージョンを示します。
汎用 Dictionary 型の特殊なバージョン、Dictionary<String, Int> は、汎用パラメータの Key: Hashable と Value を、具体型な引数の型 String と Int で置き換えることによって形成されます。各型の引数は、汎用の where 句で指定された全ての追加要件を含む、それが置き換える汎用パラメータのすべての制約を満たさなければなりません。上記の例では、Key の型パラメータは Hashable プロトコルに準拠するように制約されるため、String も、Hashable プロトコルに準拠しなければなりません。
また、それ自体が汎用型の特殊なバージョン (それが適切な制約と要件を満たすように提供された) である型引数を持つ型パラメータを置き換える事もできます。たとえば、その要素自体は整数の配列である配列を形成する、Array<Int> 配列の特殊なバージョンで Array<Element> 内の型パラメータ Element を置き換えることができます。
汎用パラメータ句 で述べたように、汎用の関数やイニシャライザの型引数を指定するのに、汎用引数句を使用しないでください。