楽水

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

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のデイニシャリゼーションについてわかりやすく解説

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

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

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

Swiftのプロパティラッパーをわかりやすく解説

Swiftのプロパティには、プロパティラッパーという機能が用意されています。 今回は、Swiftのプロパティラッパーについて以下の観点で解説します。 プロパティラッパーとは何か プロパティラッパーの使 …

Swiftクロージャによる強い参照の循環参照とその解決

Swiftのメモリ管理 では、 2 つのクラスインスタンスのプロパティが互いに強い参照を持つことで、どのようにして強い参照の循環参照が生成されるのかを見てきました。 また、強い参照の循環参照を切るため …

Swiftのメモリ管理【weakやunownedをわかりやすく解説】

Swiftのプログラムでweakやonwnedというキーワードをみたことはありませんか? これはSwiftが採用しているARCというメモリ管理の仕組みに関係しています。 今回は以下の観点でSwiftの …