下標是一種用於訪問集合,列表或序列中元素的快捷方式。當咱們獲取或設置某個類型的成員元素的值時,能夠使用下標經過索引去設置和檢索其對應的元素值,而不須要單獨的方法。git
subscript
關鍵字表示下標的定義,在subscript
後指定下標方法調用所需參數和返回類型。和實例方法的定義方式相同。可是下標支持對實例屬性的讀寫或只讀,此行爲和計算屬性同樣須要藉助getter
和setter
。下標能夠讓咱們經過在類型實例後的方括號中寫入一個或多個參數值來進行查詢和設置操做。
讀寫下標的聲明:github
subscript(index : Int)->Int{
get {
/* return 整數類型的值*/
}
set {
/*進行設置操做*/
}
}
複製代碼
只讀下標聲明:編程
subscript(index : Int)->Int{
get {
/* return 整數類型的值*/
}
}
複製代碼
只讀下標的聲明與只讀計算屬性同樣,能夠經過刪除get
關鍵字及其大括號來進行簡化:swift
subscript(index : Int)->Int{
/* return 整數類型的值*/
}
複製代碼
關於下標的使用,大多數狀況下,單個參數的下標形式最爲常見。但在合適的場景下,下標能夠使用任意數量,任意類型的輸入參數,同時也能夠返回任何類型的實例做爲返回值。下標的參數能夠使用提供默認值的可變參數,但不能使用輸入輸出參數inout
。
下標的重載:類或結構體能夠根據須要提供多個下標的實現(名稱一致,參數不一致或返回值不一致)。同一個類或結構體中定義多個下標實現的形式稱爲下標的重載。
使用舉例:定義一個二維矩陣Matrix
的結構體,並實現使用下標使得Matrix
能夠按照行,列來獲取和設置矩陣中的值。bash
struct Matrix {
var description: String{
var line = 0
var desStr = ""
for item in matrixArray.enumerated() {
if item.0 / columns == line {
desStr += "|" + String(item.1) + ""
} else {
line = item.0 / columns
desStr += "|"
//換行符
desStr += "\n" + "|" + String(item.1)
}
}
return "輸出的矩陣爲:"+"\n"+desStr + "|"
}
let rows : Int,columns : Int
var matrixArray : [Double]
init(rows:Int,columns : Int) {
self.rows = rows
self.columns = columns
matrixArray = Array.init(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), "行或者列的下標超出了矩陣的邊界")
return matrixArray[row * columns + columns]
}
set {
assert(indexIsValid(row: row, column: column), "行或者列的下標超出了矩陣的邊界")
matrixArray[row * columns + column] = newValue
}
}
//! 重載`Matrix`的下標:定義係數設置時累積
subscript(row:Int,column:Int,factor:Double)->Double{
get {
assert(indexIsValid(row: row, column: column), "行或者列的下標超出了矩陣的邊界")
return matrixArray[row * columns + columns]
}
set {
assert(indexIsValid(row: row, column: column), "行或者列的下標超出了矩陣的邊界")
matrixArray[row * columns + column] = newValue * factor
}
}
}
複製代碼
調用方式與結果打印微信
var matrix = Matrix.init(rows: 3, columns: 3)
print(matrix.description)
/*
輸出的矩陣爲:
|0.0|0.0|0.0|
|0.0|0.0|0.0|
|0.0|0.0|0.0|
*/
matrix[2,2] = 3.8 //!< 修改第2行第2列的元素爲3.8
print(matrix.description)
/*
輸出的矩陣爲:
|0.0|0.0|0.0|
|0.0|0.0|0.0|
|0.0|0.0|3.8|
*/
matrix[1,1] = 6.0 //!< 修改第1行第1列的元素爲6.0
print(matrix.description)
/*
輸出的矩陣爲:
|0.0|0.0|0.0|
|0.0|6.0|0.0|
|0.0|0.0|3.8|
*/
matrix[0,0,2.0] = 4.5
print(matrix.description)
/*
輸出的矩陣爲:
|9.0|0.0|0.0|
|0.0|6.0|0.0|
|0.0|0.0|3.8|
*/
複製代碼
實例下標是在特定類型的實例上調用的下標。同時咱們也能夠定義類型下標,類型下標:定義在類型自己上的下標。
方式:經過在subscript
關鍵字以前寫static
關鍵字來表示類型下標。類能夠使用class
關鍵字,以容許子類覆蓋父類中該下標的實現。事實證實在Swift 5.1中類型下標是不被容許的。ui
參考資料: swift 5.1官方編程指南spa
小編微信:可加並拉入《QiShare技術交流羣》。3d
關注咱們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公衆號)
推薦文章:
今天咱們來聊一聊WebSocket(iOS/Golang)
用 Swift 進行貝塞爾曲線繪製
Swift 5.1 (11) - 方法
Swift 5.1 (10) - 屬性
iOS App後臺保活
奇舞週刊