楽水

人々の創造が自由に表現できる舞台づくり

Swift

Swiftのサブスクリプトをわかりやすく解説

投稿日:

Swiftでは、クラス、構造体、および列挙型には、コレクション、リスト、シーケンスのメンバー要素にアクセスするショートカットであるサブスクリプトを定義することができます。
今回は、Swiftのサブスクリプトについて以下の観点で解説します。

  • サブスクリプトとは何か
  • サブスクリプトの使い方

参考本
[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus

サブスクリプトとは何か

サブスクリプトとは、クラス、構造体、および列挙型には、コレクション、リスト、シーケンスのメンバー要素にアクセスするショートカットで、角括弧を使って値を設定、取得します。
例えば、Swift の Dictionary 型は、Dictionary インスタンスに保管される値を設定、取得するサブスクリプトを実装しています。
なので、以下のようにDictionary インスタンスではsomeDictionary[key] のようにインデックスでメンバー要素にアクセスすることができます。

var numberOfLegs = [“spider”: 8, “ant”: 6, “cat”: 4]
numberOfLegs[“bird”] = 2

Array インスタンスの場合も同様で、 someArray[index] としてメンバー要素にアクセスすることができます。
DictionaryやArrayはすでにサブスクリプトが定義されていますが、以下のようなシンタックスで、クラスや構造体、列挙型に独自のサブスクリプトを定義することができます。

subscript(index: Int) -> Int {
 get {
  // 適切なサブスクリプト値を返す
 }
 set(newValue) {
  // 適切な設定を実行
 }
}

サブスクリプトの使い方

次の例は読み取り専用のサブスクリプト実装で、整数 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])”)
// “six times three is 18” と出力

また、サブスクリプトは、型に対しても定義することができます。
型に定義されたサブスクリプトのことをタイプスクリプトといいます。
以下の例のように、タイプスクリプトを定義するときは、staticキーワードを使用します。

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)

この例の場合、列挙型であるPlanetのRaw値を指定してPlanetインスタンスのメンバー要素を返すタイプスクリプトを定義しています。
なお、サブスクリプトは入力パラメータをいくつでも取ることができ、入力パラメータの型も問いません。
また、サブスクリプトはどのような型でも返すことができます。
サブスクリプトは変数パラメータや可変数パラメータにすることができますが、入出力パラメータにすることやパラメータのデフォルト値を付けることはできません。
クラスや構造体は必要なだけサブスクリプトの実装を持つことができ、利用される適切なサブスクリプトは、使用時にサブスクリプトの角括弧内にある値の型をもとに推論されます。
複数のサブスクリプトの定義をサブスクリプトオーバーロードと呼びます。

以上、今回は、Swiftのサブスクリプトについて解説しました。

-Swift
-,

執筆者: