SWIFT-サブスクリプト


スクリプトは、クラス、構造体、および列挙で定義および使用できます.
サブスクリプトは、集合、リスト、シーケンスなどの特定のメンバーに簡単にアクセスできる構文です.例えば、Arrayインスタンスの特定の別名はsomeArray[index]シンタックスであり、Dictionaryインスタンスの特定の別名はsomeDictionary[index]であり得る.
1つのタイプで複数のサブスクリプトを定義したり、再ロードしたりできます.それだけでなく、パラメータ値を超えて、必要に応じて複数のパラメータ値を使用することもできます.

サブスクリプト構文


サブスクリプト宣言構文は、インスタンスメソッドと計算を宣言するプロセスに似ています.インスタンスメソッドとは異なり、サブスクリプトは読み取り-書き込みまたは読み取り専用のみです.定義は、計算されたproperty方式と同様に、settergetter方式に従う.
subscript(index: Int) -> Int {
    get {
        // 적절한 반환 값
    }
    set(newValue) {
        // 적절한 set 액션
    }
}
サブスクリプトのsetにパラメータ値を指定しない場合、デフォルトではnewValueが使用されます.宣言が読取り専用である場合はgetsetを削除し、指定しない場合はgetとして動作するため、宣言は読取り専用とする.
subscript(index: Int) -> Int {
    // 적절한 반환 값
}
次に、読み取り専用として宣言されたサブスクリプトを示します.
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" 출력

サブスクリプトの使用


次はDictionary中性子スクリプトの使用です.
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
タイプ推定によれば、numberOfLegsの値は[String: Int]のタイプを有する.numberOfLegs["bird"] = 2はDictionaryタイプ変数numberOfLegsのkeyであり、birdの値は2のサブスクリプト構文である.

サブスクリプト・オプション


サブスクリプトは、入力パラメータの数を制限したり、入力パラメータのタイプや戻りタイプを制限したりしません.ただし、in-outパラメータまたはデフォルトパラメータ値は指定できません.サブスクリプトでは、オーバーロードも許可されます.したがって、パラメータ型、戻り型に基づいて任意の数のサブスクリプトを宣言できます.次に、サブスクリプトを使用して多次元マトリクスを宣言およびアクセスする例を示します.
struct Matrix {
    let rows: Int, columns: Int
    var grid: [Double]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        grid = Array(repeating: 0.0, count: rows * columns)
    }
    func indexIsValid(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}
上記のコードでは、subscript(row: Int, column: Int) -> Doubleコードのようにrow、columnの2つのパラメータを受け入れdoubleを返すサブスクリプトが宣言されています.get、setは、それぞれindexIsValidメソッドを使用してassertを呼び出し、有効なインデックスではない場合に直ちにプログラムを終了させる.サブスクリプト構文var matrix = Martrix(rows: 2, columns: 2)を使用して2 X 2行列を宣言します.

grid配列は、rowおよびcolumnを有するマトリクス動作をサブスクリプトによって実行する.サブスクリプトを使用して、マトリクスに特定のrow/columnの値を入力できます.
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2

マトリクスの入出力時にrow/columnの範囲が適切かどうかを次のコードでチェックします.
func indexIsValid(row: Int, column: Int) -> Bool {
    return row >= 0 && row < rows && column >= 0 && column < columns
}
適切な範囲を超えた場合はassertを実行します.
let someValue = matrix[2, 2]
// [2, 2]가 사용할 수 있는 행렬의 범위를 벗어나므로 assert가 실행