楽水

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

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

執筆者:

関連記事

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

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

Swiftの列挙型をわかりやすく解説

プログラムを作成するとき、曜日(月曜日、火曜日、水曜日、木曜日、金曜日、土曜日、日曜日)やカードのスート(スペード、クラブ、ダイヤ、ハード)のように決まった範囲の要素(種類)を持つ集合を扱う場合がある …

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

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

Swiftの継承についてわかりやすく解説

クラスは、別のクラスからメソッド、プロパティ、および他の特徴を継承することができます。 あるクラスが別のクラスから継承するとき、継承するクラスをサブクラス、継承されるクラスをスーパークラスと呼びます。 …

Swiftの関数のパラメータ【引数ラベルなどについてわかりやすく解説】

Swift 関数には、パラメータ名の無いシンプルな関数から、引数ラベルや各種パラメータがあるメソッドまで表現できる柔軟性があります。 パラメータは、関数の呼び出しを簡略化するためのデフォルト値を持つこ …