Swift:subscript
阿新 • • 發佈:2017-06-07
字典 art repeated 裏的 擴展 我們 tab app clas
代碼中的grid成員屬性是一個含有rows * cols 個元素的一維數組。
通常情況下。我們在使用數組(Array)或字典(Dictionary)時會使用到下標。事實上在Swift中。我們還能夠給類、結構、枚舉等自己定義下標(subscript)。
一、基本使用
struct TimesTable { let multiplier: Int subscript(index: Int) -> Int { return multiplier * index } }我在TimesTable這個結構中自己定義了一個subscript。而且這個subscript類似於方法,看上去它的類型為 Int -> Int。
然後在調用的時候。就能夠使用"[index]"這種形式取值。
let threeTimesTable = TimesTable(multiplier: 3) println("six times three is \(threeTimesTable[7])")
二、使用subscript能夠刪除字典中的某個特定的key-value
var numberOfLegs = ["spider":8,"ant":6,"cat":4] numberOfLegs["ant"] = nil println(numberOfLegs.count)上面的numberOfLegs初始時候它有三對值,當進行numberOfLegs["ant"] = nil 操作後,相當於key為"ant"的key-value被刪除了。所以打印的結果為2。
三、subscript中的索引參數不一定永遠是一個Int類型的index,它也能夠有多個參數。
比如。我們能夠使用subscript將一維數組模擬成二維數組。
struct Matrix { let rows: Int let cols: Int var grid: [Double] init(rows: Int, cols: Int) { self.rows = rows self.cols = cols self.grid = Array(count: rows * cols, repeatedValue: 0.0) } func indexIsValidForRow(row: Int, col: Int) -> Bool { return row >= 0 && row < rows && col >= 0 && col < cols; } subscript(row: Int, col: Int) -> Double { get { assert(indexIsValidForRow(row, col: col), "index out of range") return grid[row * cols + col] } set { assert(indexIsValidForRow(row, col: col), "index out of range") grid[row * cols + col] = newValue } } }
然後定義一個subscript, 這裏的下標有兩個:row和col。然後依據詳細的輸入參數,從grid數組中取出相應的值。
所以這裏的下標僅僅是模擬。看起來輸入row和col,但實際還是從一維數組grid中取值。
調用效果例如以下:
var matrix = Matrix(rows: 3, cols: 4) matrix[2, 1] = 3.4 matrix[1, 2] = 5 // var some2 = matrix[1, 2] println("some:\(some2)")四、獲取數組中指定索引位置的子數組,我們能夠在Array的擴展中用subscript來實現。
extension Array { subscript(input: [Int]) -> ArraySlice<T> { get { var array = ArraySlice<T>() for i in input { assert(i < self.count, "index out of range") array.append(self[i]) } return array } set { // i表示數組input自己的索引,index表示數組self的索引 for (i, index) in enumerate(input) { assert(index < self.count, "index out of range") self[index] = newValue[i] } } } }代碼中的input數組表示選取的Array中的某些下標。比如:
arr數組
var arr = [1, 2, 3, 4, 5]input數組
var input = [0,2]那麽通過input中的值在arr數組中取得的子數組為 [1, 3]
subscript中的get方法就是依據input中的數組的下標值取得arr數組中相應下標的子數組。
subscript中的set方法就是依據input中的數組的下標值對arr數組中相應下標的內容又一次賦值。
Swift:subscript