在swift中,class, structures 和enum都可以定義subscript,subscript可以幫助我們更方便的訪問或者設置一個集合中的某個成員。
下面借助一個官網(wǎng)的實例可以幫助我們更清楚的明白這個功能。
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
}
}
}
上面的代碼定義了一個結構體Matrix,我們通過設置row和column來初始化一個矩陣:
var matrix = Matrix(rows: 2, columns: 2)
但是在內部卻是用一個數(shù)組來存儲的,存儲結構就變成一維的了
grid = [0.0, 1.0, 2.0, 3.0]
我們要獲取第三個元素2.0就需要通過grid[2]來訪問了,假如我們還是想通過row與column來訪問grid中的數(shù)據(jù)呢?
這時候就是subscript登場的時候了。
我們通過定義subscript(row: Int, column: Int) -> Double來自動計算row與column實際上對應的是grid中的哪個值,grid用row與cloumn表示出來就是一個2*2的矩陣:
grid = [ 0,0, 1.0,
2.0, 3.0]
row與column與grid中的下標對應的關系也就是: index = row*維度+column
這樣我們就可以用如下方式來設置或者獲取matrix中的元素值:
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
在這個例子中,我們還用了indexIsValid來判斷row與column是否在矩陣范圍內。