# サブスクリプト

Swiftでは、サブスクリプトは添え字のことをいいます。配列や辞書などのコレクションにアクセスできるための記述であり、配列のインデックスや辞書のキー名になります。

let array = [1,2,3,4]
let dictionary = ["key1": "value", "key2": "value"]

array[0] // 1
dictionary["key1"] // 1

# サブスクリプトの定義方法

サブスクリプトの定義方法は、subscript キーワードを記述し、{} 内に get キーワードでゲッタを、set キーワードでセッタを定義します。ゲッタは必須ですが、セッタは任意になります。

struct MyStruct {
  subscript(引数: 引数の型) -> 戻り値の型 {
    get {
      // ゲッタの処理
    }

    set {
      // セッタの処理
    }
  }
}

次の例では、構造体にサブスクリプトを定義しています。Int型のインデックスを受けとり、プロパティから該当する値を返しています。

struct Person {
  var pets: [String]

  subscript(index: Int) -> String {
    // インデックスを指定して pets の中から値を取り出す
    get {
      return pets[index]
    }

    // 新しい値を追加する
    set {
      pets[index] = newValue
    }
  }
}

var person1 = Person(pets: ["Cat", "Dog", "Rabbit"])

person1[0] // Cat

person1[1] = "Hamster"
person1[1] // Hamster

# 省略

ゲッタは必須ですが、セッタは任意なので省略することができます。セッタがない場合は、ゲッタは省略した書き方をすることができます。

get キーワードと、{} を省略して書くことができます。

struct Person {
  var pets: [String]

  // get キーワードと、{} を省略
  subscript(index: Int) -> String {
    return pets[index]
  }
}

var person1 = Person(pets: ["Cat", "Dog", "Rabbit"])

person1[0] // Cat

# スタティックサブスクリプト | Static Subscripts

スタティックサブスクリプトは、型に紐づくサブスクリプトです。型に添え字をつけることで、プロパティの値にアクセスすることができます。

スタティックサブスクリプトを定義するには、static キーワードを subscript の前につけます。

enum Animal: Int {
    case cat = 1, dog, rabbit, hamster

    // static キーワードをつける
    static subscript(n: Int) -> Animal {
        return Animal(rawValue: n)!
    }
}

let cat = Animal[1] // cat