Swift Academy · レッスン

サブスクリプトとカスタムインデックス再入門

get / set を使ったサブスクリプトを定義し、複数のパラメーター(例:2D行列)を受け取り、 custom index types (列挙型)で読みやすいAPIを作成します。

レッスン 2/38 ステップ

「サブスクリプトとカスタムインデックス再入門」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。

サブスクリプトとは

サブスクリプトを使うと、インスタンスを配列のようにインデックスで参照できます。次のことが可能です。

  • 読み取り専用または読み書き可能なアクセスを提供する
  • 複数のパラメータ(例: 行/列)を受け取る
  • 明確さを高めるため、列挙型などのカスタムインデックスを使う

読み取り専用サブスクリプト

setを使わずに値を返すことで、サブスクリプトを読み取り専用にできます。

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int { multiplier * index } // read-only
}
let t = TimesTable(multiplier: 3)
print(t[4]) // 12

get/setによる読み書き

読み書き可能なアクセスにはget/setを追加します。クラッシュを避けるため、インデックスを検証してください。

struct SafeArray<T> {
    private var storage: [T]
    init(_ xs: [T]) { self.storage = xs }
    subscript(i: Int) -> T? {
        get { (0..<storage.count).contains(i) ? storage[i] : nil }
        set {
            guard let v = newValue, (0..<storage.count).contains(i) else { return }
            storage[i] = v
        }
    }
}
var s = SafeArray([10,20,30])
print(s[1] ?? -1) // 20
s[1] = 99
print(s[1] ?? -1) // 99
s[5] = 7          // ignored (out of range)

2次元インデックス

サブスクリプトは複数のパラメータを受け取り、明確さを高めるためにラベルを使用できます(例: row/col)。

struct Matrix {
    let rows: Int, cols: Int
    private var grid: [Int]
    init(_ r: Int, _ c: Int, fill: Int = 0) {
        rows = r; cols = c; grid = Array(repeating: fill, count: r * c)
    }
    private func valid(_ r: Int, _ c: Int) -> Bool { r >= 0 && r < rows && c >= 0 && c < cols }
    subscript(row r: Int, col c: Int) -> Int {
        get { precondition(valid(r,c), "Index out of range"); return grid[r*cols + c] }
        set { precondition(valid(r,c), "Index out of range"); grid[r*cols + c] = newValue }
    }
}
var m = Matrix(2, 3)
m[row: 0, col: 1] = 5
print(m[row: 0, col: 1]) // 5

カスタムインデックス(列挙型)

意図を明確にするためにカスタムインデックスを使用します。列挙型をストレージに対応付けることで、表現力の高いAPIを維持できます。

enum Day: Int, CaseIterable { case mon = 0, tue, wed, thu, fri, sat, sun }
struct Week {
    private var tasks = Array(repeating: "—", count: Day.allCases.count)
    subscript(day: Day) -> String {
        get { tasks[day.rawValue] }
        set { tasks[day.rawValue] = newValue }
    }
}
var w = Week()
w[.wed] = "Ship"
print(w[.wed])

設計のヒント

ヒント:

  • 要素へのアクセスにはサブスクリプトを優先し、操作にはメソッドを使用してください。
  • インデックスを検証してください(assert/precondition、または安全なオプショナルを使用します)。
  • 複数の軸にアクセスする場合は、パラメータに名前を付けてください。
  • サブスクリプトは高速で予測可能なものにしてください。

読み書き可能な宣言

確認問題: 読み書き可能なサブスクリプトを宣言するのはどれですか?

まとめ

まとめ: 読み取り専用と読み書き可能なサブスクリプトを作成し、行列のように複数のパラメータを受け取り、読みやすさと安全性のために列挙型などのカスタムインデックスを優先してください。

無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「サブスクリプトとカスタムインデックス再入門」レッスンは無料ですか?

はい。「サブスクリプトとカスタムインデックス再入門」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。

「サブスクリプトとカスタムインデックス再入門」で何を学びますか?

get / set を使ったサブスクリプトを定義し、複数のパラメーター(例:2D行列)を受け取り、 custom index types (列挙型)で読みやすいAPIを作成します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「サブスクリプトとカスタムインデックス再入門」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 演算子オーバーロードと優先順位グループ
  2. サブスクリプトとカスタムインデックス再入門
  3. Hashable/Equatable/Comparableの自動導出
← Swift Academyに戻る