Swift study - Subscripts


Swift - Subscripts


クラス、構造体、および列挙型は、セット、リスト、または順序のメンバー要素にアクセスするためのショートカットキーとしてサブスクリプトを定義します.サブスクリプトを使用して、他のメソッドの設定や検索を必要とせずにインデックス検索と値の設定を行います.例えば、someArray[index]を使用して配列内の要素にアクセスすることができ、ディック郡の例はsomeDictionary[key]を使用することができる.
1つのタイプの複数のサブスクリプトを定義し、サブスクリプトに渡されるインデックス値のタイプに応じて適切なサブスクリプトを選択できます.サブスクリプトは1つの階層に限定されず、設定したタイプのニーズを満たすために複数のパラメータを定義できます.

Subscript Syntax(サブスクリプト構文)


サブスクリプトは、インスタンス名の後ろのカッコに1つ以上の値を作成することで、タイプのインスタンスを検索します.この構文は、インスタンスメソッド構文と計算されたProperty構文に似ています.subscriptキーワードを使用してサブスクリプトを定義し、インスタンスメソッドに従って1つ以上の入力パラメータと戻りタイプを指定できます.インスタンスメソッドとは異なり、サブスクリプトは読み取り専用または読み取り専用です.この動作は来賓と来賓によって伝達され、計算のプログラムと同じ方法である.
subscript(index: Int) -> Int {
    get {
        // Return an appropriate subscript value here.
    }
    set(newValue) {
        // Perform a suitable setting action here.
    }
}
newValueのタイプは、サブスクリプトの戻り値と同じです.計算されたプログラムと同様に、パラメータを指定することなく選択できます.基本パラメータはnewValueと呼ばれ、直接提供されなければセイトに提供される.
読み取り専用計算プロパティと同様に、getキーワードを削除することで、読み取り専用propertyを簡単に宣言できます.
subscript(index: Int) -> Int {
    // Return an appropriate subscript value here.
}

// 읽기-전용 서브스크립트 구현
struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"
上記の例では、サブスクリプト(threeTimesTable[6])を呼び出すことによって、threeTimesTableインスタンスを検索することができる.これはthree-times-tableの6番目の項目を要求します.
NOTE
以上の排水表は固定的な数学規則に従っている.新しい値を設定するのに適していないため、上記のサブスクリプトは読み取り専用プログラムとして定義されています.

Subscript Usage(サブスクリプトを使用)


サブスクリプトの正確な意味は、使用するコンテキストの場所によって異なります.サブスクリプトは、通常、コレクション、リスト、およびシーケンスメンバー要素にアクセスするショートカットキーとして使用されます.サブスクリプトは、特定のクラスまたは構造体の機能に最も適した方法で自由に実現できます.
たとえば、swiftのdickshernerタイプは、dickshernerインスタンスに格納されている値を検索および設定するためにサブスクリプトを実装します.サブスクリプトの角カッコにdicksherryキータイプのキーを指定し、サブスクリプトにdicksherry値タイプの値を割り当てることで値を設定できます.
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
上のディックシャナリタイプは[String: Int]と推定される.
NOTE
swiftのdickshernerタイプは、戻りタイプとサブスクリプトを運ぶキー値サブスクリプトを実行します.上記の例では、キー値サブスクリプトは、ディクシャナの場合、Int? or optional intタイプの値を有するか、または返す.ディックシャナタイプは、外部サブスクリプトタイプを使用して、すべての鍵が値を持たない事実をモデリングし、これらの鍵にnilを割り当てることによって削除方法を提供する.

速博適用オプション(サブスクリプトオプション)


サブスクリプトは、複数の入力パラメータを受信できますが、これらの入力パラメータは任意のタイプです.また、サブスクリプトは任意のタイプの値を返します.
関数のように、サブスクリプトには異なる数のパラメータがあり、そのパラメータのデフォルト値を指定できます.関数とは異なり、サブスクリプトでは入出力パラメータは使用できません.
必要に応じて、クラスまたは構造体は、複数のサブスクリプトの実装を提供し、使用する適切なサブスクリプトは、値のタイプまたはサブスクリプトカッコに含まれる値に基づいて導出されます.この複数のサブスクリプトは、サブスクリプトオーバーロードとして定義されます(subscript overloading).
1つのパラメータを持つサブスクリプトが最も一般的ですが、複数のパラメータを含むサブスクリプトを適切なタイプに定義することもできます.サンプル構造には、次の2つの整数パラメータがあります.
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
        }
    }
}
上の行列は、頭文字Liserを提供し、2つのタイプのrows * columns値を格納するのに十分な配列を生成する.配列の各位置には、0.0が初期値として与えられます.これを得るために、配列の寸法、初期値は、その寸法を初期化し、作成する新しい配列の頭文字Riserに渡されます.
// 적당한 열과 행 값을 주어 매트릭스 인스턴스를 만들 수 있다.
var matrix = Matrix(rows: 2, columns: 2)
このマトリクスインスタンスのグリッド配列は、2 D配列が左上右下から読み込まれたときに有効なスムーズ(1 D)配列です.

元の2 Dタイル
// 값을 설정하는 모습
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2

マトリクス構文のゲストとゲストには、サブスクリプトのカラムとローの値が有効かどうかを検証するためのブレークスルーが含まれています.これを助けるために、行列は、列と行が行列の境界内にあるかどうかを調べるindexIsValid(row:column:)と呼ばれる便利な方法を含む.
func indexIsValid(row: Int, column: Int) -> Bool {
    return row >= 0 && row < rows && column >= 0 && column < columns
}

let someValue = matrix[2, 2]
// 어설션이 발생한다. 범위 밖이기 때문.

タイプSubscripts(タイプサブスクリプト)


前述したように、インスタンスサブスクリプトは、特定のタイプのインスタンスから呼び出されるサブスクリプトです.タイプ内で自分で呼び出すサブスクリプトを定義できます.これらのサブスクリプトをタイプサブスクリプトと呼びます.タイプのサブスクリプトを表すために、サブスクリプトキーワードの前にstaticキーワードを記述することができる.クラスはclassのキーワードで置き換えることができ、サブスクリプトの親の実装をサブクラスで上書き(再定義)することもできます.次の例です.
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)
// mars 출력