楽水

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

Swift

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

投稿日:2020年9月29日 更新日:


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
-,

執筆者:

関連記事

Swiftのオプショナル【?や!をわかりやすく解説】

Javaでプログラムを書いたことがあるプログラマーであれば「NullPointerException」というエラーで悩まされた方もいらっしゃるのではないでしょうか。 これは、オブジェクトに対する参照が …

Swiftのクロージャについてわかりやすく解説

Swiftのクロージャって何? いまひとつわからない、という方むけに、今回は、Swiftのクロージャについて以下の観点で丁寧に解説します。 Swiftのクロージャとは何か Swiftのクロージャ式 S …

Swiftのクロージャのエスケープ【escapingについてわかりやすく解説】

Swiftを学ぶ過程でescapingというキーワードに出会うことがあると思います。 今回は、クロージャのescapingについて以下の観点で丁寧も解説します。 Swiftのクロージャのescapin …

Swiftのプロパティ【プロパティオブザーバーなどをわかりやすく解説】

プロパティは値と特定のクラスや構造体、列挙型を結び付けます。 Swiftのプロパティには、値を保持するプロパティだけではなく様々な種類のプロパティがあります。 今回は、Swiftのプロパティについて以 …

Swiftのデイニシャリゼーションについてわかりやすく解説

Swiftでは、インスタンスが必要でなくなったとき、リソースを解放するために、自動参照カウント (ARC) という方法でインスタンスの割り当てを解除します。 インスタンスの割り当て解除が行わ …