The Swift Programming Language をまとめるトップ
Subscripts(サブスクリプティング)
クラス、構造体、列挙型にサブスクリプトを定義することができる
サブスクリプトはコレクション(配列、連想配列など)の要素にアクセスするための簡易的な方法
データの操作するメソッド等を別途つくらないで、簡単にデーターの操作ができる
一つの型に複数のサブスクリプトを定義することができる
適切なサブスクリプトが都度適切に選択されて作動する
複数のパラメータをサブスクリプトに定義することができる
Subscript Syntax(シンタックス)
インスタンスの名前に続けて記述できる
インスタンスメソッドと算出プロパティの記述に類似
メソッドの定義と同じ様にサブスクリプトのキーワードと複数のパラメータによって構成
read-write と read-only も定義可能で、算出プロパティの設定と同じ
基本形
subscript(index: Int) -> Int {
get {
// return サブスクリプトの戻り値
}
set(newValue) {
// ここで設定操作をする
}
}
newValueの型
サブスクリプトの戻り値の型と同じ
算出プロパティと同様に newValue を記述しなくて問題ない
読み取り専用サブスクリプト
set と get を省く
subscript(index: Int) -> Int {
// return サブスクリプトの戻り値
}
読み取り専用の例
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
println("6 * 3 = \(threeTimesTable[6])")
// prints "6 * 3 = 18"
初期化するときに、multiplier に 3 をセットして、 threeTimesTable インスタンスを呼ぶ時に get でその multiplier に index 6 を掛けて 18 を返している
Subscript Usage(利用方法)
いまいち理解できていないどなたかに補足してもらいたい
サブスクリプトはコンテクストによって使われ方が様々ある
一般的には配列や連想配列やリストやセクエンスの操作の簡略手法として用いられる
クラスや構造体の機能として利用する事が多い
連想配列型のインスタンスを作成する
そして、その値を取得するためにサブスクリプトが作動する
サブスクリプト内で連想配列の操作ができる
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
上記、key-value のペーアでリテラルで連想配列を numberOfLegs として初期化
numberOfLegs は Dictionary として型が推論される
そして、 "bird" の文字列キーで整数値 2 がサブスクリプによって設定される
詳細はAccessing and Modifying a Dictionary(ディクショナリ・連想配列操作、更新) まで
NOTE
key に対して必ず値があるとは限らないので、 key-value のサブスクリプトは Int(Optional int)を返す
Subscript Options
複数の引数を受ける事ができる
後、あらゆる型を返す事ができる
値の処理系なので in-out引数(参照渡し)はつかえない
クラスと構造体で必要なだけサブスクリプトの定義ができる
サブスクリプトが呼ばれたときに、{}
に含まれる値の型がによって適切なサブスクリプトがよばれる
これを subscript overloading サブスクリプトのオーバーロディングという
一番一般的な利用は、引数を一つだけ受けるサブスクリプトになるが、複数の引数を受ける事も必要に応じて可能
以下の Matrix 構造体の例をみてみる
struct Matrix {
let rows: Int, columns: Int
var grid: Double[]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(count: rows * columns, repeatedValue: 0.0)
}
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValidForRow(row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValidForRow(row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
Matrix は初期化する時に 2 つのパラメータを受ける rows と columns
rows * columns を保持するための Double を生成
それぞれのポジションのは 0.0 という初期値を定義する
以下の様に定義してみる
var matrix = Matrix(rows: 2, columns: 2)