下標可以定義在類、結構體和列舉中,是訪問集合,列表或序列中元素的快捷方式。可以使用下標的索引,設定和獲取值,而不需要再呼叫對應的訪問方法。舉例來說,用下標訪問乙個array例項中的元素可以寫作somearray[index],訪問dictionary例項中的元素可以寫作somedictionary[key]。
乙個型別可以定義多個下標,通過不同索引型別進行過載。下標不限於一維,你可以定義具有多個入參的下標滿足自定義型別的需求。
下標允許你通過在例項名稱後面的方括號中傳入乙個或者多個索引值來對例項進行訪問。語法類似於例項方法語法和計算型屬性語法的混合。與定義例項方法類似,定義下標使用subscript關鍵字,指定乙個或多個輸入引數和返回型別;與例項方法不同的是,下標可以設定為讀寫或唯讀。這種行為由 getter 和 setter 實現,有點類似計算型屬性:
subscript(index: int) -> int
set(newvalue)
}
newvalue的型別和下標的返回型別相同。如同計算型屬性,可以不指定 setter 的引數(newvalue)。如果不指定引數,setter 會提供乙個名為newvalue的預設引數。
如同唯讀計算型屬性,可以省略唯讀下標的get關鍵字:
subscript(index: int) -> int
下面**演示了唯讀下標的實現,這裡定義了乙個timestable結構體,用來表示傳入整數的乘法表:
struct timestable
}let threetimestable = timestable(multiplier: 3)
print("six times three is \(threetimestable[6])")
// 列印 "six times three is 18"
在上例中,建立了乙個timestable例項,用來表示整數3的乘法表。數值3被傳遞給結構體的建構函式,作為例項成員multiplier的值。
你可以通過下標訪問threetimestable例項,例如上面演示的threetimestable[6]。這條語句查詢了3的乘法表中的第六個元素,返回3的6倍即18。
注意下標的確切含義取決於使用場景。下標通常作為訪問集合,列表或序列中元素的快捷方式。你可以針對自己特定的類或結構體的功能來自由地以最恰當的方式實現下標。timestable例子基於乙個固定的數學公式,對threetimestable[someindex]進行賦值操作並不合適,因此下標定義為唯讀的。
例如,swift 的dictionary型別實現下標用於對其實例中儲存的值進行訪問操作。為字典設值時,在下標中使用和字典的鍵型別相同的鍵,並把乙個和字典的值型別相同的值賦給這個下標:
var numberoflegs = ["spider": 8, "ant": 6, "cat": 4]
numberoflegs["bird"] = 2
上例定義乙個名為numberoflegs的變數,並用乙個包含三對鍵值的字典字面量初始化它。numberoflegs字典的型別被推斷為[string: int]。字典建立完成後,該例子通過下標將string型別的鍵bird和int型別的值2新增到字典中。
注意下標可以接受任意數量的入參,並且這些入參可以是任意型別。下標的返回值也可以是任意型別。下標可以使用變數引數和可變引數,但不能使用輸入輸出引數,也不能給引數設定預設值。swift 的dictionary型別的下標接受並返回可選型別的值。上例中的numberoflegs字典通過下標返回的是乙個int?或者說「可選的int」。dictionary型別之所以如此實現下標,是因為不是每個鍵都有個對應的值,同時這也提供了一種通過鍵刪除對應值的方式,只需將鍵對應的值賦值為nil即可。
乙個類或結構體可以根據自身需要提供多個下標實現,使用下標時將通過入參的數量和型別進行區分,自動匹配合適的下標,這就是下標的過載。
雖然接受單一入參的下標是最常見的,但也可以根據情況定義接受多個入參的下標。例如下例定義了乙個matrix結構體,用於表示乙個double型別的二維矩陣。matrix結構體的下標接受兩個整型引數:
struct matrix
func indexisvalidforrow(row: int, column: int) -> bool
subscript(row: int, column: int) -> double
set
}}
你可以通過傳入合適的row和column的數量來構造乙個新的matrix例項:
var matrix = matrix(rows: 2, columns: 2)
matrix下標的 getter 和 setter 中都含有斷言,用來檢查下標入參row和column的值是否有效。為了方便進行斷言,matrix包含了乙個名為indexisvalidforrow(_:column:)的便利方法,用來檢查入參row和column的值是否在矩陣範圍內:
func indexisvalidforrow(row: int, column: int) -> bool
斷言在下標越界時觸發:
let somevalue = matrix[2, 2]
// 斷言將會觸發,因為 [2, 2] 已經超過了 matrix 的範圍
swift學習 下標指令碼
定義 下標指令碼 可以定義在類 class 結構體 structure 和列舉 enumeration 這些目標中,可以認為是訪問物件 集合或序列的快捷方式,不需要再呼叫例項的特定的賦值和訪問方法。舉例來說,用下標指令碼訪問乙個陣列 array 例項中的元素可以這樣寫 somearray index...
學習Swift 下標指令碼
下標指令碼可以定義在類 class 結構體 structure 和列舉 enumeration 這些目標中,可以認為是訪問集合 collection 列表 list 或序列 sequence的快捷方式,使用下標指令碼的索引設定和獲取值,不需要再呼叫例項的特定的賦值和訪問方法。舉例來說,用下標指令碼訪...
14 5 下標運算子
表示容器的類通常可以通過元素在容器中的位置訪問元素,這些類一般會定義下標運算子operator。下標運算子必須是成員函式。為了與下標的原始定義相容,下標運算子通常以所訪問元素的引用作為返回值,這樣做的好處是下標可以出現在賦值運算子的任意一端。進一步,我們最好同時定義下標運算子的常量版本和非常量版本,...