The Swift Programming Language - Subscripts（サブスクリプティング）をまとめる


[The Swift Programming Language をまとめるトップ](http://qiita.com/kiyotaman/items/052f82e9f93590b79c64)

## Subscripts（サブスクリプティング）
クラス、構造体、列挙型にサブスクリプトを定義することができる
サブスクリプトはコレクション（配列、連想配列など）の要素にアクセスするための簡易的な方法
データの操作するメソッド等を別途つくらないで、簡単にデーターの操作ができる

一つの型に複数のサブスクリプトを定義することができる
適切なサブスクリプトが都度適切に選択されて作動する
複数のパラメータをサブスクリプトに定義することができる

### Subscript Syntax（シンタックス）
インスタンスの名前に続けて記述できる
インスタンスメソッドと算出プロパティの記述に類似
メソッドの定義と同じ様にサブスクリプトのキーワードと複数のパラメータによって構成
read-write と read-only も定義可能で、算出プロパティの設定と同じ

基本形

```swift
subscript(index: Int) -> Int {
	get {
	// return サブスクリプトの戻り値
	}
	set(newValue) {
	// ここで設定操作をする
	}
}
```

#### newValueの型
サブスクリプトの戻り値の型と同じ
算出プロパティと同様に newValue を記述しなくて問題ない

#### 読み取り専用サブスクリプト
set と get を省く

```swift
subscript(index: Int) -> Int {
	// return サブスクリプトの戻り値
}
```

読み取り専用の例

```swift
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（利用方法）

**いまいち理解できていないどなたかに補足してもらいたい**

サブスクリプトはコンテクストによって使われ方が様々ある
一般的には配列や連想配列やリストやセクエンスの操作の簡略手法として用いられる
クラスや構造体の機能として利用する事が多い

連想配列型のインスタンスを作成する
そして、その値を取得するためにサブスクリプトが作動する
サブスクリプト内で連想配列の操作ができる

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

上記、key-value のペーアでリテラルで連想配列を numberOfLegs として初期化
numberOfLegs は Dictionary<String, Int> として型が推論される
そして、 "bird" の文字列キーで整数値 2 がサブスクリプによって設定される

詳細は[Accessing and Modifying a Dictionary（ディクショナリ・連想配列操作、更新）](http://qiita.com/kiyotaman/items/4d41a8081a3c64878f75#4-7) まで

> **NOTE**
key に対して必ず値があるとは限らないので、 key-value のサブスクリプトは Int（Optional int）を返す


### Subscript Options
複数の引数を受ける事ができる
後、あらゆる型を返す事ができる
値の処理系なので in-out引数（参照渡し）はつかえない

クラスと構造体で必要なだけサブスクリプトの定義ができる
サブスクリプトが呼ばれたときに、```{}``` に含まれる値の型がによって適切なサブスクリプトがよばれる
これを **subscript overloading** サブスクリプトのオーバーロディングという

一番一般的な利用は、引数を一つだけ受けるサブスクリプトになるが、複数の引数を受ける事も必要に応じて可能
以下の Matrix 構造体の例をみてみる

```swift
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 という初期値を定義する
以下の様に定義してみる

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

[あとひとまずSubscript Options参照](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html#//apple_ref/doc/uid/TP40014097-CH16-XID_398)