位置:首頁 > 高級語言 > Swift教學 > Swift下標腳本選項

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提供了一個兩個入參的構造方法,入參分彆是rowscolumns,創建了一個足夠容納rows * columns個數的Double類型數組。為了存儲,將數組的大小和數組每個元素初始值0.0,都傳入數組的構造方法中來創建一個正確大小的新數組。關於數組的構造方法和析構方法請參考創建並且構造一個數組

你可以通過傳入合適的rowcolumn的數量來構造一個新的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]

將值賦給帶有rowcolumn下標腳本的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下標腳本的gettersetter中同時調用了下標腳本入參的rowcolumn是否有效的判斷。為了方便進行斷言,Matrix包含了一個名為indexIsValid的成員方法,用來確認入參的rowcolumn值是否會造成數組越界:

func indexIsValidForRow(row: Int, column: Int) -> Bool {
    return row >= 0 && row < rows && column >= 0 && column < columns
}

斷言在下標腳本越界時觸發:

let someValue = matrix[2, 2]
// 斷言將會觸發,因為 [2, 2] 已經超過了matrix的最大長度