Swift 添字スクリプト


サブスクリプト スクリプトは、クラス、構造体、列挙などのターゲットで定義でき、インスタンスやアクセス メソッドの特定の割り当てを呼び出すことなく、オブジェクト、コレクション、またはシーケンスにアクセスするためのショートカットとして考えることができます。

たとえば、添字スクリプトを使用して配列 (Array) インスタンス内の要素にアクセスするには、someArray[index] と記述し、辞書 (Dictionary) インスタンス内の要素にアクセスするには、someDictionary[key] と記述します。 。

同じターゲットに対して複数の添字スクリプトを定義でき、異なるインデックス値タイプでオーバーロードでき、インデックス値の数は複数にすることができます。


サブスクリプト スクリプトの構文とアプリケーション

構文

サブスクリプト スクリプトを使用すると、インスタンスの後の角括弧内に 1 つ以上のインデックス値を渡すことで、インスタンスにアクセスして値を割り当てることができます。

構文は、インスタンス メソッドと計算されたプロパティを組み合わせたものに似ています。

インスタンス メソッドの定義と同様に、添え字スクリプトの定義では、添え字キーワードを使用して、入力パラメーター (1 つ以上) と戻り値の型を明示的に宣言します。

インスタンス メソッドとは異なり、サブスクリプト スクリプトは読み取り/書き込みまたは読み取り専用に設定できます。このメソッドは、計算されたプロパティのゲッターとセッターに少し似ています:

subscript(index: Int) -> Int {
    get {
        // 用于下标脚本值的声明
    }
    set(newValue) {
        // 执行赋值操作
    }
}

インスタンス 1

import Cocoa

struct subexample {
    let decrementer: Int
    subscript(index: Int) -> Int {
        return decrementer / index
    }
}
let division = subexample(decrementer: 100)

print("100 除以 9 等于 \(division[9])")
print("100 除以 2 等于 \(division[2])")
print("100 除以 3 等于 \(division[3])")
print("100 除以 5 等于 \(division[5])")
print("100 除以 7 等于 \(division[7])")

上記のプログラムの実行の出力結果は次のとおりです:

100 除以 9 等于 11
100 除以 2 等于 50
100 除以 3 等于 33
100 除以 5 等于 20
100 除以 7 等于 14

上記の例では、除算演算のインスタンスは次のように作成されます。サブサンプル構造。値 100 がパラメーターとして構造体コンストラクターに渡され、インスタンス メンバーのデクリメンターが初期化されます。

スクリプトに添字を付けることで結果を取得できます。たとえば、division[2] は 100 を 2 で割ったものです。

例 2

import Cocoa

class daysofaweek {
    private var days = ["Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "saturday"]
    subscript(index: Int) -> String {
        get {
            return days[index]   // 声明下标脚本的值
        }
        set(newValue) {
            self.days[index] = newValue   // 执行赋值操作
        }
    }
}
var p = daysofaweek()

print(p[0])
print(p[1])
print(p[2])
print(p[3])

上記のプログラムの実行出力は次のとおりです:

Sunday
Monday
Tuesday
Wednesday

使用法

添え字スクリプトも使用シナリオに応じて異なる意味を持ちます。

通常、添え字スクリプトは、コレクション、リスト、またはシーケンス内の要素にアクセスするために使用されるショートカットです。

独自の特定のクラスまたは構造に添字スクリプトを自由に実装して、適切な機能を提供できます。

たとえば、Swift の辞書は、添え字スクリプトを介してインスタンスに保存されている値へのアクセスを実装します。添字スクリプトの辞書インデックスと同じタイプの値を使用し、添字フットに辞書値タイプの値を代入して辞書の値を設定します:

import Cocoa

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

print(numberOfLegs)

上記のプログラム実行の出力結果は次のとおりです:

["ant": 6, "bird": 2, "cat": 4, "spider": 8]

上記の例では、numberOfLegs という名前の変数が、辞書リテラルを持つ 3 つのキーと値のペアを含む辞書インスタンスを初期化します。 numberOfLegs の辞書ストレージ値の型は、Dictionary


Subscript スクリプト オプション

として推論されます。Subscript スクリプトでは、任意の数の入力パラメーター インデックスが許可され、各入力パラメーター タイプに制限はありません。

添字スクリプトの戻り値も任意の型にすることができます。

添え字スクリプトでは、変数パラメーターと可変引数パラメーターを使用できます。

クラスまたは構造体は、独自のニーズに応じて複数の添え字スクリプト実装を提供できます。添え字スクリプトを定義する場合、渡されるパラメーターのタイプによって区別されます。添え字スクリプトを使用する場合、適切な添え字スクリプトと自動的に一致します。これは、サブスクリプト スクリプトのオーバーロードです。

import Cocoa

struct Matrix {
    let rows: Int, columns: Int
    var print: [Double]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        print = Array(count: rows * columns, repeatedValue: 0.0)
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            return print[(row * columns) + column]
        }
        set {
            print[(row * columns) + column] = newValue
        }
    }
}
// 创建了一个新的 3 行 3 列的Matrix实例
var mat = Matrix(rows: 3, columns: 3)

// 通过下标脚本设置值
mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,1] = 5.0

// 通过下标脚本获取值
print("\(mat[0,0])")
print("\(mat[0,1])")
print("\(mat[1,0])")
print("\(mat[1,1])")

上記のプログラムの実行の出力結果は次のとおりです:

1.0
2.0
3.0
5.0

Matrix 構造体は、2 つの入力パラメーターを使用した構築メソッドを提供します。この 2 つのパラメーターは行と列であり、行数 * 列数を収容するのに十分な Double 型の配列を作成します。ストレージの場合、配列のサイズを設定し、配列の各要素を 0.0 に初期化します。

適切な数の行と列を渡すことで、新しい Matrix インスタンスを構築できます。