Swift 6.0 beta 日本語化計画 : Swift 6.0 beta
サブスクリプト
クラス、構造体、および列挙型は、コレクション、リスト、またはシーケンスのメンバー要素にアクセスするための近道である サブスクリプト (添字) を定義できます。設定や取得のために別々のメソッドを必要とせず索引をつけて値を設定し、取得するためにサブスクリプトを使用して下さい。たとえば、someArray[index] で Array インスタンス内の要素にアクセスし、someDictionary[key] で Dictionary インスタンス内の要素にアクセスできます。
一つの型に複数のサブスクリプトを定義でき、使用するのに適切なサブスクリプトのオーバーロ−ドは、サブスクリプトに渡すインデックス値の型に基づいて選択されます。サブスクリプトは一次元に限定されるものではなく、カスタム型のニーズに合わせて複数の入力パラメータを持つサブスクリプトを定義できます。
サブスクリプトは、インスタンス名の後の角括弧内に1つ以上の値を書くことにより、型のインスタンスを照会することができます。その構文は、インスタンスメソッドの構文と計算されたプロパティの構文の両方に似ています。subscript キーワードでサブスクリプトの定義を書き、インスタンスメソッドと同じように、1つ以上の入力パラメータと戻り値の型を指定して下さい。インスタンスメソッドとは異なり、サブスクリプトは、読み取り専用にも読み書き可能にもなります。この動作は、計算されたプロパティの場合と同じようにゲッタとセッタによって伝達されます。
newValue の型は、サブスクリプトの戻り値と同じです。計算されたプロパティと同様に、セッタの (newValue) パラメータを指定しないことを選択できます。一つも自分でパラメータを提供しない場合、newValue と言うデフォルトのパラメータが、セッタに提供されます。
読み取り専用の計算されたプロパティと同様に、get キーワードとその括弧を削除することで、読み取り専用のサブスクリプトの宣言を単純化できます。
ここで整数の n 倍の表を表現するために TimesTable 構造体を定義する、読み取り専用のサブスクリプトの実装の例を示します。
この例では、TimesTable の新しいインスタンスが3倍の表を表現するために作成されます。これは、インスタンスの multiplier パラメータに使用する値として、構造体の initializer に 3 の値を渡すことによって示されます。
threeTimesTable[6] への呼び出しに示すように、そのサブスクリプトを呼び出すことによって、 threeTimesTable インスタンスを照会できます。これは、3倍の表で6番目のエントリを要求し、つまり 6 の 3 倍の 18 の値を返します。
"サブスクリプト" の正確な意味は、それが使用される文脈に依存しています。サブスクリプト (添字) は、典型的には、コレクション、リスト、またはシーケンス内のメンバ要素にアクセスするための近道として使用されます。特定のクラスまたは構造体の機能のために最も適切な方法でサブスクリプトを自由に実装できます。
たとえば、Swift の Dictionary 型は、Dictionary インスタンスに格納された値を設定・取得するためにサブスクリプトを実装します。サブスクリプトの括弧内の辞書のキー型のキーを提供し、辞書の値型の値をサブスクリプトに代入することで辞書内の値を設定できます。
上記の例では、numberOfLegs と言う変数を定義し、3つのキー値のペアを含む辞書リテラルで初期化しています。numberOfLegs 辞書の型は、[String: Int] であることが推測されます。辞書を作成した後、この例では、"bird" の String キーと、2 の Int 値を辞書に追加するのにサブスクリプトの代入を使用しています。
Dictionary のサブスクリプトの詳細については、Dictionary のアクセスと変更 を参照してください。
サブスクリプトは入力パラメータを任意の数取ることができ、これらの入力パラメータは、任意の型でありえます。サブスクリプトはまた、任意の型の値を返すこともできます。
関数と同様に、サブスクリプトは可変個数のパラメータを取る事が出来、それらのパラメータのデフォルト値を提供できます (可変引数パラメータ と デフォルトのパラメータ値 で説明)。ただし、関数とは異なり、サブスクリプトでは in-out パラメータは使用できません。
クラスまたは構造体は、必要とされるだけ多くの数のサブスクリプトの実装を提供でき、使用されるべき適切なサブスクリプトは、サブスクリプトが使用される時点でサブスクリプトの括弧内に含まれる値または値の型に基づいて推測されます。複数のサブスクリプトのこの定義は、サブスクリプトのオーバーロード として知られています。
サブスクリプトが単一のパラメータを取ることは最も一般的ですが、型に適している場合は、複数のパラメータを持つサブスクリプトを定義することもできます。以下の例では、Double の値の 2 次元行列を表す Matrix 構造体を定義しています。Matrix 構造体のサブスクリプトは、2 つの整数パラメータを取ります。
Matrix は、rows と columns と言う2つのパラメータを取るイニシャライザを提供し、Double 型の rows * columns の値を格納するのに十分な大きさの配列を作成します。matrix (行列) 内の各位置には、0.0 の初期値が与えられます。これを実現するために、配列 (array) のサイズ、および 0.0 の初期セル値は、配列イニシャライザに渡され、正しいサイズの新しい配列を作成し、初期化します。このイニシャライザについては、デフォルト値を持つ配列の作成 で、より詳しく説明しています。
そのイニシャライザに適切な行 (row) と列 (column) のカウントを渡すことによって、新しい Matrix インスタンスを構築できます。
上記の例では、2行2列で新しい Matrix インスタンスを作成しています。左上から右下に読むと、この Matrix インスタンスの grid 配列は、効果的に行列を平坦化したバージョンです。
matrix 内の値は、カンマで区切ってサブスクリプトに行と列の値を渡すことで設定できます。
これら二つの文は、matrix の右上の位置 (row が 0 で column が 1) に 1.5 の値を設定するためにサブスクリプトのセッタを呼び出し、左下の位置 (row が 1 で、column が 0) に 3.2 を設定します。
Matrix のサブスクリプトのゲッタとセッタは両方とも、サブスクリプトの row と column の値が有効であることをチェックするためアサーションを含んでいます。これらのアサーションを支援するために、要求された row と column が matrix の境界の内側にあるかどうかをチェックする、indexIsValid(row:column:) と言うコンビニエンスメソッドを Matrix は含んでいます。
matrix の境界の外にあるサブスクリプトにアクセスしようとすると、アサーションが引き起こされます。
インスタンス・サブスクリプトは、上記のように、特定の型のインスタンスで呼び出すサブスクリプトです。型自体で呼び出されるサブスクリプトを定義することもできます。この種のサブスクリプトは、型サブスクリプト と呼ばれます。型サブスクリプトを指定するには、subscript キーワードの前に static キーワードを記述して下さい。クラスは代わりに class キーワードを使用して、サブクラスがそのサブスクリプトのスーパークラスの実装をオーバーライドできるようにします。以下の例は、型サブスクリプトを定義して呼び出す方法を示しています。