サブスクリプト(添字)
日本語を消す 英語を消す下記URLから引用し、日本語訳をつけてみました。
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/subscripts
Access the elements of a collection.
コレクションの要素にアクセスします。
Classes, structures, and enumerations can define subscripts, which are shortcuts for accessing the member elements of a collection, list, or sequence. You use subscripts to set and retrieve values by index without needing separate methods for setting and retrieval. For example, you access elements in an Array
instance as someArray[index]
and elements in a Dictionary
instance as someDictionary[key]
.
クラス、構造体、列挙型では、コレクション、リスト、またはシーケンスのメンバー要素にアクセスするためのショートカットである添え字を定義できます。 添字を使用すると、設定と取得に別のメソッドを必要とせずに、インデックスによって値を設定および取得できます。 たとえば、Array
インスタンス内の要素には someArray[index]
としてアクセスし、Dictionary
インスタンス内の要素には someDictionary[key]
としてアクセスします。
You can define multiple subscripts for a single type, and the appropriate subscript overload to use is selected based on the type of index value you pass to the subscript. Subscripts aren’t limited to a single dimension, and you can define subscripts with multiple input parameters to suit your custom type’s needs.
1 つの型に対して複数の添字を定義でき、添字に渡すインデックス値の型に基づいて、使用する適切な添字オーバーロードが選択されます。 添字は 1 つの次元に限定されず、カスタム 型のニーズに合わせて複数の入力パラメーターを使用して添字を定義できます。
Subscript Syntax
添え字の構文
Subscripts enable you to query instances of a type by writing one or more values in square brackets after the instance name. Their syntax is similar to both instance method syntax and computed property syntax. You write subscript definitions with the subscript
keyword, and specify one or more input parameters and a return type, in the same way as instance methods. Unlike instance methods, subscripts can be read-write or read-only. This behavior is communicated by a getter and setter in the same way as for computed properties:
添字を使用すると、インスタンス名の後に角括弧内に 1 つ以上の値を記述することで、型のインスタンスをクエリできます。 それらの構文は、インスタンス メソッドの構文と計算されたプロパティの構文の両方に似ています。 インスタンス メソッドと同じように、subscript
キーワードを使用して添字定義を記述し、1 つ以上の入力パラメータと戻り値の型を指定します。 インスタンス メソッドとは異なり、サブスクリプトは読み取り/書き込みまたは読み取り専用にすることができます。 この動作は、計算されたプロパティの場合と同じ方法でゲッターとセッターによって伝達されます。
subscript(index: Int) -> Int {
get {
// Return an appropriate subscript value here.
}
set(newValue) {
// Perform a suitable setting action here.
}
}
The type of newValue
is the same as the return value of the subscript. As with computed properties, you can choose not to specify the setter’s (newValue)
parameter. A default parameter called newValue
is provided to your setter if you don’t provide one yourself.
newValue
の型は添え字の戻り値と同じです。 計算プロパティと同様に、セッターの (newValue
) パラメータを指定しないことも選択できます。 newValue
というデフォルトのパラメータは、自分で指定しない場合、セッターに提供されます。
As with read-only computed properties, you can simplify the declaration of a read-only subscript by removing the get
keyword and its braces:
読み取り専用の計算プロパティと同様に、get
キーワードとその中括弧を削除することで、読み取り専用の添字の宣言を簡素化できます。
subscript(index: Int) -> Int {
// Return an appropriate subscript value here.
}
Here’s an example of a read-only subscript implementation, which defines a TimesTable
structure to represent an n-times-table of integers:
これは、整数の n 倍のテーブルを表す TimesTable
構造を定義する読み取り専用の添字実装の例です。
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"
In this example, a new instance of TimesTable
is created to represent the three-times-table. This is indicated by passing a value of 3
to the structure’s initializer
as the value to use for the instance’s multiplier
parameter.
この例では、TimesTable
の新しいインスタンスが 3 回の表を表すために作成されます。 これは、インスタンスのmultiplier
パラメータに使用する値として値 3
を構造体のinitializer
に渡すことで示されます。
You can query the threeTimesTable
instance by calling its subscript, as shown in the call to threeTimesTable[6]
. This requests the sixth entry in the three-times-table, which returns a value of 18
, or 3
times 6
.
threeTimesTable[6]
への呼び出しに示すように、そのサブスクリプトを呼び出すことで、threeTimesTable
インスタンスをクエリできます。 これにより、three-times-table の 6 番目のエントリがリクエストされ、値 18
、つまり 3
に 6
を掛けた値が返されます。
Note
注釈
An n-times-table is based on a fixed mathematical rule. It isn’t appropriate to set threeTimesTable[someIndex]
to a new value, and so the subscript for TimesTable
is defined as a read-only subscript.
n 倍表は、固定された数学的ルールに基づいています。 threeTimesTable[someIndex]
を新しい値に設定するのは適切ではないため、TimesTable
の添字は読み取り専用の添字として定義されています。
Subscript Usage
添え字の使用法
The exact meaning of “subscript” depends on the context in which it’s used. Subscripts are typically used as a shortcut for accessing the member elements in a collection, list, or sequence. You are free to implement subscripts in the most appropriate way for your particular class or structure’s functionality.
「添え字」の正確な意味は、それが使用される文脈によって異なります。 添字は通常、コレクション、リスト、またはシーケンス内のメンバー要素にアクセスするためのショートカットとして使用されます。 特定のクラスまたは構造体の機能に最も適切な方法で添字を自由に実装できます。
For example, Swift’s Dictionary
type implements a subscript to set and retrieve the values stored in a Dictionary
instance. You can set a value in a dictionary by providing a key of the dictionary’s key type within subscript brackets, and assigning a value of the dictionary’s value type to the subscript:
たとえば、Swift の Dictionary
型は、Dictionary
インスタンスに保存されている値を設定および取得するための添字を実装しています。 辞書に値を設定するには、添字括弧内に辞書のキー 型のキーを指定し、辞書の値型の値を添字に割り当てます。
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
The example above defines a variable called numberOfLegs
and initializes it with a dictionary literal containing three key-value pairs. The type of the numberOfLegs
dictionary is inferred to be [String: Int]
. After creating the dictionary, this example uses subscript assignment to add a String
key of "bird"
and an Int
value of 2
to the dictionary.
上の例では、numberOfLegs
という変数を定義し、3 つのキーと値のペアを含む辞書リテラルで初期化します。 numberOfLegs
辞書の型は [String: Int]
であると推測されます。 辞書を作成した後、この例では添字の割り当てを使用して、「bird
」の String
キーと 2
の Int
値を辞書に追加します。
For more information about Dictionary
subscripting, see Accessing and Modifying a Dictionary.
Dictionary
の添え字の詳細については、「辞書へのアクセスと変更」を参照してください。
Note
注釈
Swift’s Dictionary
type implements its key-value subscripting as a subscript that takes and returns an optionaltype. For the numberOfLegs
dictionary above, the key-value subscript takes and returns a value of type Int?
, or “optional int”. The Dictionary
type uses an optional subscript type to model the fact that not every key will have a value, and to give a way to delete a value for a key by assigning a nil
value for that key.
Swift の Dictionary
型は、その Key-Value 添字を、optionaltype を受け取って返す添字として実装します。 上記のnumberOfLegs
辞書の場合、Key-Value添字は型Int?
または「optional int」の値を受け取り、返します。 Dictionary
型は、オプションの添え字型を使用して、すべてのキーに値があるわけではないという事実をモデル化し、キーに nil
値を割り当てることでキーの値を削除する方法を提供します。
Subscript Options
添え字のオプション
Subscripts can take any number of input parameters, and these input parameters can be of any type. Subscripts can also return a value of any type.
添字は任意の数の入力パラメータを取ることができ、これらの入力パラメータは任意の型にすることができます。 添字は任意の型の値を返すこともできます。
Like functions, subscripts can take a varying number of parameters and provide default values for their parameters, as discussed in Variadic Parameters and Default Parameter Values. However, unlike functions, subscripts can’t use in-out parameters.
「可変引数パラメータ」と「デフォルトのパラメータ値」で説明されているように、関数と同様に、添字はさまざまな数のパラメータを受け取り、パラメータのデフォルト値を提供できます。 ただし、関数とは異なり、添え字では in-out パラメーターを使用できません。
A class or structure can provide as many subscript implementations as it needs, and the appropriate subscript to be used will be inferred based on the types of the value or values that are contained within the subscript brackets at the point that the subscript is used. This definition of multiple subscripts is known as subscript overloading.
クラスまたは構造体は必要な数の添え字実装を提供でき、使用される適切な添え字は、添え字が使用される時点で添え字括弧内に含まれる値の型に基づいて推測されます。 複数の添字のこの定義は、添字のオーバーロードとして知られています。
While it’s most common for a subscript to take a single parameter, you can also define a subscript with multiple parameters if it’s appropriate for your type. The following example defines a Matrix
structure, which represents a two-dimensional matrix of Double
values. The Matrix
structure’s subscript takes two integer parameters:
添字が 1 つのパラメーターを取るのが最も一般的ですが、型に適している場合は、複数のパラメーターを含む添字を定義することもできます。 次の例では、Double
値の 2 次元行列を表す Matrix
構造を定義します。 Matrix
構造の添字は 2 つの整数パラメータを取ります。
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
Matrix
provides an initializer that takes two parameters called rows
and columns
, and creates an array that’s large enough to store rows * columns
values of type Double
. Each position in the matrix is given an initial value of 0.0
. To achieve this, the array’s size, and an initial cell value of 0.0
, are passed to an array initializer that creates and initializes a new array of the correct size. This initializer is described in more detail in Creating an Array with a Default Value.
Matrix
は、rows
とcolumns
と呼ばれる 2 つのパラメータを受け取るイニシャライザを提供し、Double
型のrows * columns
の値を格納するのに十分な大きさの配列を作成します。 マトリックスの各位置には、初期値 0.0
が与えられます。 これを実現するには、配列のサイズと初期セル値 0.0
が、正しいサイズの新しい配列を作成して初期化する配列初期化子に渡されます。 このイニシャライザについては、「デフォルト値を使用した配列の作成」で詳しく説明します。
You can construct a new Matrix
instance by passing an appropriate row and column count to its initializer:
適切な行数と列数を初期化子に渡すことで、新しい Matrix
インスタンスを構築できます。
var matrix = Matrix(rows: 2, columns: 2)
The example above creates a new Matrix
instance with two rows and two columns. The grid
array for this Matrix
instance is effectively a flattened version of the matrix, as read from top left to bottom right:
上の例では、2 行 2 列の新しい Matrix
インスタンスを作成します。 この Matrix
インスタンスのgrid
配列は、左上から右下に読むと、事実上、行列の平坦化されたバージョンです。
Values in the matrix can be set by passing row and column values into the subscript, separated by a comma:
行列の値は、行と列の値をカンマで区切って添え字に渡すことで設定できます。
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
These two statements call the subscript’s setter to set a value of 1.5
in the top right position of the matrix (where row
is 0
and column
is 1
), and 3.2
in the bottom left position (where row
is 1
and column
is 0
):
これら 2 つのステートメントは、添字のセッターを呼び出して、行列の右上の位置 (row
が 0
、column
が 1
) に値 1.5
を設定し、左下の位置 (row
が 1
、column
が 0
) に 3.2
を設定します。
The Matrix
subscript’s getter and setter both contain an assertion to check that the subscript’s row
and column
values are valid. To assist with these assertions, Matrix
includes a convenience method called indexIsValid(row:column:)
, which checks whether the requested row
and column
are inside the bounds of the matrix:
マトリックスの添字のゲッターとセッターの両方には、添字のrow
とcolumn
の値が有効であることを確認するアサーションが含まれています。 これらのアサーションを支援するために、Matrix
には、要求されたrow
とcolumn
が行列の境界内にあるかどうかをチェックする、indexIsValid(row:column:)
という便利なメソッドが含まれています。
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
An assertion is triggered if you try to access a subscript that’s outside of the matrix bounds:
行列の範囲外にある添字にアクセスしようとすると、アサーションがトリガーされます。
let someValue = matrix[2, 2]
// This triggers an assert, because [2, 2] is outside of the matrix bounds.
Type Subscripts
型の添字
Instance subscripts, as described above, are subscripts that you call on an instance of a particular type. You can also define subscripts that are called on the type itself. This kind of subscript is called a type subscript. You indicate a type subscript by writing the static
keyword before the subscript
keyword. Classes can use the class
keyword instead, to allow subclasses to override the superclass’s implementation of that subscript. The example below shows how you define and call a type subscript:
インスタンスの添字は、上で説明したように、特定の型のインスタンスに対して呼び出す添字です。 型自体で呼び出される添字を定義することもできます。 この種の添字は型添字と呼ばれます。 型の添字を指定するには、subscript
キーワードの前にstatic
キーワードを記述します。 クラスでは代わりに class
キーワードを使用して、サブクラスがその添え字のスーパークラスの実装をオーバーライドできるようにすることができます。 以下の例は、型添字を定義して呼び出す方法を示しています。
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
static subscript(n: Int) -> Planet {
return Planet(rawValue: n)!
}
}
let mars = Planet[4]
print(mars)