Swift 5.3 日本語化計画 : Swift 5.3


サブスクリプト


クラス、構造体、および列挙型は、コレクション、リスト、またはシーケンスのメンバー要素にアクセスするための近道である サブスクリプト (添字) を定義できます。設定や取得のために別々のメソッドを必要とせず索引をつけて値を設定し、取得するためにサブスクリプトを使用して下さい。たとえば、someArray[index]Array インスタンス内の要素にアクセスし、someDictionary[key]Dictionary インスタンス内の要素にアクセスできます。


一つの型に複数のサブスクリプトを定義でき、使用するのに適切なサブスクリプトのオーバーロ−ドは、サブスクリプトに渡すインデックス値の型に基づいて選択されます。サブスクリプトは一次元に限定されるものではなく、カスタム型のニーズに合わせて複数の入力パラメータを持つサブスクリプトを定義できます。



サブスクリプトの構文


サブスクリプトは、インスタンス名の後の角括弧内に1つ以上の値を書くことにより、型のインスタンスを照会することができます。その構文は、インスタンスメソッドの構文と計算されたプロパティの構文の両方に似ています。subscript キーワードでサブスクリプトの定義を書き、インスタンスメソッドと同じように、1つ以上の入力パラメータと戻り値の型を指定して下さい。インスタンスメソッドとは異なり、サブスクリプトは、読み取り専用にも読み書き可能にもなります。この動作は、計算されたプロパティの場合と同じようにゲッタとセッタによって伝達されます。


  1. subscript(index: Int) -> Int {
  2. get {
  3. // return an appropriate subscript value here
  4. }
  5. set(newValue) {
  6. // perform a suitable setting action here
  7. }
  8. }


newValue の型は、サブスクリプトの戻り値と同じです。計算されたプロパティと同様に、セッタの (newValue) パラメータを指定しないことを選択できます。一つも自分でパラメータを提供しない場合、newValue と言うデフォルトのパラメータが、セッタに提供されます。


読み取り専用の計算されたプロパティと同様に、get キーワードとその括弧を削除することで、読み取り専用のサブスクリプトの宣言を単純化できます。


  1. subscript(index: Int) -> Int {
  2. // return an appropriate subscript value here
  3. }


ここで整数の n 倍の表を表現するために TimesTable 構造体を定義する、読み取り専用のサブスクリプトの実装の例を示します。


  1. struct TimesTable {
  2. let multiplier: Int
  3. subscript(index: Int) -> Int {
  4. return multiplier * index
  5. }
  6. }
  7. let threeTimesTable = TimesTable(multiplier: 3)
  8. print("six times three is \(threeTimesTable[6])")
  9. // prints "six times three is 18"


この例では、TimesTable の新しいインスタンスが3倍の表を表現するために作成されます。これは、インスタンスの multiplier パラメータに使用する値として、構造体の initializer3 の値を渡すことによって示されます。


threeTimesTable[6] への呼び出しに示すように、そのサブスクリプトを呼び出すことによって、 threeTimesTable インスタンスを照会できます。これは、3倍の表で6番目のエントリを要求し、つまり 63 倍の 18 の値を返します。


注意: n 倍の表は、固定された数学的ルールに基づいています。threeTimesTable[someIndex] を新しい値に設定することは適切ではなく、したがって TimesTable のサブスクリプトは、読み取り専用のサブスクリプトとして定義されます。


サブスクリプトの使用法


"サブスクリプト" の正確な意味は、それが使用される文脈に依存しています。サブスクリプト (添字) は、典型的には、コレクション、リスト、またはシーケンス内のメンバ要素にアクセスするための近道として使用されます。特定のクラスまたは構造体の機能のために最も適切な方法でサブスクリプトを自由に実装できます。


たとえば、Swift の Dictionary 型は、Dictionary インスタンスに格納された値を設定・取得するためにサブスクリプトを実装します。サブスクリプトの括弧内の辞書のキー型のキーを提供し、辞書の値型の値をサブスクリプトに割り当てることで辞書内の値を設定できます。


  1. var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
  2. numberOfLegs["bird"] = 2


上記の例では、numberOfLegs と言う変数を定義し、3つのキー値のペアを含む辞書リテラルで初期化しています。numberOfLegs 辞書の型は、[String: Int] であることが推測されます。辞書を作成した後、この例では、"bird"String キーと、2Int 値を辞書に追加するのにサブスクリプトの割り当てを使用しています。


Dictionary のサブスクリプトの詳細については、Dictionary のアクセスと変更 を参照してください。



注意: Swift の Dictionary 型は、optional の型を取って返す、サブスクリプトとしてそのキー値の添字を実装します。上記の numberOfLegs 辞書の場合、キー値のサブスクリプトは、Int? 型、または "optional Int" の値を取って返します。Dictionary 型は、すべてのキーが値を持つとは限らず、そのキーに nil 値を割り当てることにより、キーの値を削除する方法を与えるという事実をモデル化するために、optional のサブスクリプトを使用します。


サブスクリプトのオプション


サブスクリプトは入力パラメータを任意の数取ることができ、これらの入力パラメータは、任意の型でありえます。サブスクリプトはまた、任意の型の値を返すこともできます。


関数と同様に、サブスクリプトは可変個数のパラメータを取る事が出来、それらのパラメータのデフォルト値を提供できます (可変個パラメータデフォルトのパラメータ値 で説明)。ただし、関数とは異なり、サブスクリプトでは in-out パラメータは使用できません。


クラスまたは構造体は、必要とされるだけ多くの数のサブスクリプトの実装を提供でき、使用されるべき適切なサブスクリプトは、サブスクリプトが使用される時点でサブスクリプトの括弧内に含まれる値または値の型に基づいて推測されます。複数のサブスクリプトのこの定義は、サブスクリプトのオーバーロード として知られています。


サブスクリプトが単一のパラメータを取ることは最も一般的ですが、型に適している場合は、複数のパラメータを持つサブスクリプトを定義することもできます。以下の例では、Double の値の 2 次元行列を表す Matrix 構造体を定義しています。Matrix 構造体のサブスクリプトは、2 つの整数パラメータを取ります。


  1. struct Matrix {
  2. let rows: Int, columns: Int
  3. var grid: [Double]
  4. init(rows: Int, columns: Int) {
  5. self.rows = rows
  6. self.columns = columns
  7. grid = Array(repeating: 0.0, count: rows * columns)
  8. }
  9. func indexIsValid(row: Int, column: Int) -> Bool {
  10. return row >= 0 && row < rows && column >= 0 && column < columns
  11. }
  12. subscript(row: Int, column: Int) -> Double {
  13. get {
  14. assert(indexIsValid(row: row, column: column), "Index out of range")
  15. return grid[(row * columns) + column]
  16. }
  17. set {
  18. assert(indexIsValid(row: row, column: column), "Index out of range")
  19. grid[(row * columns) + column] = newValue
  20. }
  21. }
  22. }


Matrix は、rowscolumns と言う2つのパラメータを取るイニシャライザを提供し、Double 型の rows * columns の値を格納するのに十分な大きさの配列を作成します。matrix (行列) 内の各位置には、0.0 の初期値が与えられます。これを実現するために、配列 (array) のサイズ、および 0.0 の初期セル値は、配列イニシャライザに渡され、正しいサイズの新しい配列を作成し、初期化します。このイニシャライザについては、デフォルト値を持つ配列の作成 で、より詳しく説明しています。


そのイニシャライザに適切な行 (row) と列 (column) のカウントを渡すことによって、新しい Matrix インスタンスを構築できます。


var matrix = Matrix(rows: 2, columns: 2)



上の例では、2行2列で新しい Matrix インスタンスを作成しています。左上から右下に読むと、この Matrix インスタンスの grid 配列は、効果的に行列を平坦化したバージョンです。



subscriptMatrix01_2x


matrix 内の値は、カンマで区切ってサブスクリプトに行と列の値を渡すことで設定できます。


  1. matrix[0, 1] = 1.5
  2. matrix[1, 0] = 3.2


これら二つの文は、matrix の右上の位置 (row0column1) に 1.5 の値を設定するためにサブスクリプトのセッタを呼び出し、左下の位置(row1 で、column0) に 3.2 を設定します。



subscriptMatrix02_2x


Matrix のサブスクリプトのゲッタとセッタは両方とも、サブスクリプトの rowcolumn の値が有効であることをチェックするためアサーションを含んでいます。これらのアサーションを支援するために、要求された rowcolumn が matrix の境界の内側にあるかどうかをチェックする、indexIsValid(row:column:) と言うコンビニエンスメソッドを Matrix は含んでいます。


  1. func indexIsValidForRow(row: Int, column: Int) -> Bool {
  2. return row >= 0 && row < rows && column >= 0 && column < columns
  3. }


matrix の境界の外にあるサブスクリプトにアクセスしようとすると、アサーションが引き起こされます。


  1. let someValue = matrix[2, 2]
  2. // this triggers an assert, because [2, 2] is outside of the matrix bounds


型サブスクリプト


インスタンスのサブスクリプトは、上記のように、特定の型のインスタンスで呼び出すサブスクリプトです。型自体で呼び出されるサブスクリプトを定義することもできます。この種のサブスクリプトは、型サブスクリプト と呼ばれます。型サブスクリプトを指定するには、subscript キーワードの前に static キーワードを記述して下さい。クラスは代わりに class キーワードを使用して、サブクラスがそのサブスクリプトのスーパークラスの実装をオーバーライドできるようにします。以下の例は、型サブスクリプトを定義して呼び出す方法を示しています。


  1. enum Planet: Int {
  2. case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
  3. static subscript(n: Int) -> Planet {
  4. return Planet(rawValue: n)!
  5. }
  6. }
  7. let mars = Planet[4]
  8. print(mars)


前:メソッド 次:継承
















トップへ












トップへ












トップへ












トップへ
目次
Xcode の新機能

Swift について
Swift と Cocoa と Objective-C (obsolete)
Swift Blog より (obsolete)

SwiftLogo
  • Swift 5.3 全メニュー


  • Swift へようこそ
  • Swift について
  • Swift 言語のガイド
  • Swift の基本
  • 基本演算子
  • 文字列と文字
  • コレクション型
  • フロー制御
  • 関数
  • クロージャ
  • 列挙型
  • 構造体とクラス
  • プロパティ
  • メソッド
  • サブスクリプト
  • 継承
  • 初期化
  • デイニシャライザ
  • Optional の連鎖
  • エラー処理
  • 型キャスト
  • ネストした型
  • 拡張機能
  • プロトコル
  • ジェネリック(汎用)
  • 不透明な型
  • 自動参照カウント
  • メモリの安全性
  • アクセス制御
  • 高度な演算子

  • 言語リファレンス

  • マニュアルの変更履歴













  • トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ