はじめに
今回は添字付け(subscript)についてみていきたいと思います。
subscript
subscriptとは、複数個のプロパティがある時に、配列のように、アクセスできるようにする機能です。配列以外のリストやデータ構造でも利用できます。
struct FoodMenu {
let menu = ["menu1", "menu2", "menu3"]
var submenu = ["submenu1", "submenu2", "submenu3"]
var count: Int { menu.count + submenu.count }
subscript(i: Int) -> String {
get {
return i < 3 ? menu[i] : submenu[i-3]
}
set {
if i > 2 && i < 6 {
submenu[i-3] = newValue
}
}
}
}
var foodMenu = FoodMenu()
for i in 0..<foodMenu.count {
print(foodMenu[i])
}
//menu1
//menu2
//menu3
//submenu1
//submenu2
//submenu3
foodMenu[i]
としているので、subscribe
のgetが呼ばれます。
i < 3 ? menu[i] : submenu[i-3]
から、出力結果からもわかるように、配列menu
と配列submenu
が繋がったような配列foodMenu
になっていますね。
次はsetを使ってみます。
var foodMenu = FoodMenu()
foodMenu[1] = "set1"
foodMenu[5] = "set5"
for i in 0..<foodMenu.count {
print(foodMenu[i])
}
//menu1
//menu2
//menu3
//submenu1
//submenu2
//set5
"set1"
は条件i > 2 && i < 6
を満たさないのでsetできていないのがわかります。
また、以下のように、subscriptに対してもstaticを使うこともでき、その場合はFace[2]
のようにアクセスすることができます。
struct Face {
static subscript(i: Int) -> String {
let index = (i < 0) ? 0 : (i > 4 ? 4 : i)
let faces = ["😭", "🤔", "🥳", "😉", "😡"]
return faces[index]
}
}
print(Face[3]) // 😉
おわりに
おわりです。