Swift下標腳本選項
下標腳本選項
下標腳本允許任意數量的入參索引,並且每個入參類型也沒有限制。下標腳本的返回值也可以是任何類型。下標腳本可以使用變量參數和可變參數,但使用寫入讀出(in-out)參數或給參數設置默認值都是不允許的。
一個類或結構體可以根據自身需要提供多個下標腳本實現,在定義下標腳本時通過入參個類型進行區分,使用下標腳本時會自動匹配合適的下標腳本實現運行,這就是下標腳本的重載。
一個下標腳本入參是最常見的情況,但只要有合適的場景也可以定義多個下標腳本入參。如下例定義了一個Matrix
結構體,將呈現一個Double
類型的二維矩陣。Matrix
結構體的下標腳本需要兩個整型參數:
struct Matrix {
let rows: Int, columns: Int
var grid: Double[]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(count: rows * columns, repeatedValue: 0.0)
}
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValidForRow(row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValidForRow(row, column: column), "Index out of range")
grid[(row * columns) + columns] = newValue
}
}
}
Matrix
提供了一個兩個入參的構造方法,入參分別是rows
和columns
,創建了一個足夠容納rows * columns
個數的Double
類型數組。爲了存儲,將數組的大小和數組每個元素初始值0.0,都傳入數組的構造方法中來創建一個正確大小的新數組。關於數組的構造方法和析構方法請參考創建並且構造一個數組。
你可以通過傳入合適的row
和column
的數量來構造一個新的Matrix
實例:
var matrix = Matrix(rows: 2, columns: 2)
上例中創建了一個新的兩行兩列的Matrix
實例。在閱讀順序從左上到右下的Matrix
實例中的數組實例grid
是矩陣二維數組的扁平化存儲:
// 示意圖
grid = [0.0, 0.0, 0.0, 0.0]
col0 col1
row0 [0.0, 0.0,
row1 0.0, 0.0]
將值賦給帶有row
和column
下標腳本的matrix
實例表達式可以完成賦值操作,下標腳本入參使用逗號分割
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
上面兩條語句分別讓matrix
的右上值爲 1.5,坐下值爲 3.2:
[0.0, 1.5,
3.2, 0.0]
Matrix
下標腳本的getter
和setter
中同時調用了下標腳本入參的row
和column
是否有效的判斷。爲了方便進行斷言,Matrix
包含了一個名爲indexIsValid
的成員方法,用來確認入參的row
或column
值是否會造成數組越界:
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
斷言在下標腳本越界時觸發:
let someValue = matrix[2, 2]
// 斷言將會觸發,因爲 [2, 2] 已經超過了matrix的最大長度