翻譯 Swift程式語言 下標

2021-07-03 07:59:58 字數 3397 閱讀 8908

類、結構體和列舉可以使用下標,用來方便訪問乙個集合、列表或序列的成員。可以使用下標根據索引設定和獲取值,而不需要單獨的方法。舉例來說,你可以使用somearray[index]來訪問乙個陣列的例項中的元素,也可以使用somedictionary[key]來訪問乙個字典中的元素。

可以定義單一型別的多個指令碼,根據你傳遞給指令碼的索引值的型別會自動選擇合適的過載指令碼。指令碼並不限制只能有一維,可以多個引數,以適應定製的需要。

下標可以做到:例項名稱之後的方括號中寫乙個或多個值來查詢型別例項。它的語法型別例項方法語法和計算屬性語法。使用subscript關鍵字定義下標,然後指定乙個或多餘乙個的引數和返回型別,就像例項方法一樣。不同於例項方法,下標可以是可讀寫的也可以是唯讀的。就像計算屬性一樣,這種限制是通過getter和setter實現的:

subscript​(​index​: ​int​) -> ​int​ 

​ ​set​(​newvalue​)

​}

newvalue 的型別和下標返回值的型別相同。和計算屬性一樣,你可以選擇不指定setter的引數((newvalue))。沒有指定引數的時候預設引數newvalue生效。

和唯讀計算屬性一樣,可以把唯讀指令碼中的get關鍵字丟掉:

subscript​(​index​: ​int​) -> ​int​
這裡有乙個唯讀下標的示例,它定義了乙個叫做timestable的結構體表示乙個整數的n倍數表:

truct​ ​timestable​ 

​}​let​ ​threetimestable​ = ​timestable​(​multiplier​: ​3​)

​println​(​"six times three is ​\(​threetimestable​[​6​])​"​)

​// prints "six times three is 18"

這個例子中,乙個新的timestable例項被建立,用來表現乙個整數的三倍數表。具體的,是通過傳遞乙個3給結構體的初始化方法,初始化multiplier為3.

可以通過下標查詢threetimestable例項,就像上面的threetimestable[6]。這個語句請求了three-times-table中的第六個元素,返回了18,也就是6的3倍。

note

乙個n倍數表依據的是數學規則。不會給threetimestable[someindex]賦予乙個新值,所以timestable的這個下標是乙個唯讀下標。

下標準確意義要依賴其使用的上下文。下標的典型用法是簡潔的訪問集合、列表或者序列的成員。也可以為了類或者結構體的特殊功能,用適當的方式實現下標。

舉例來說,swift的字典型別實現了乙個下標來實現對字典型別例項中的值的讀取和賦值。你可以在方括號中提供乙個字典鍵值來設定乙個字典內容,也可以將字典值賦給下標:

​var​ ​numberoflegs​ = [​"spider"​: ​8​, ​"ant"​: ​6​, ​"cat"​: ​4​]

​numberoflegs​[​"bird"​] = ​2

上面定義了乙個變數叫做numberoflegs,然後使用了包含三個鍵值對的字典的字面語句對其初始化。字典numberoflegs是乙個[string:int]型別的。建立完這個字典後,例子採用下標分配並新增了乙個鍵為「bird」,值為整型2的內容。

更多的關於字典下標的內容,參見 accessing and modifying a dictionary。

note

swift的字典型別實現了它的key-vlaue下標,通過下標得到乙個可選型別。比如上面的numberoflegs字典,它的下標返回乙個型別是int?(或者可選int)的值。字典型別使用可選型別下標來模仿不是所有的鍵都會有乙個對應的值,提供了一種處理可能對應的鍵為nil的途徑。

下標可以使用人乙個數量的引數,而且這些引數可以是任意型別的。下標可以返回任意型別。下標可以使用變數引數,也可以使用可變引數,但是不能使用in-out引數或者提供引數預設值。

乙個類好哦這結構體可以有多個下標實現,只要有必要,會根據在方括號中的值型別選擇合適的下標實現。這種多下標的情況叫做下標過載(subscript overloading)。

儘管多數下標採用單一引數,但是你也可以定義多個引數的。下面的例子定義了乙個矩陣結構體,表示了乙個二維double矩陣。它的下標就採用了兩個整型做引數:

struct​ ​matrix​ 

​ ​func​ ​indexisvalidforrow​(​row​: ​int​, ​column​: ​int​) -> ​bool​

​ ​subscript​(​row​: ​int​, ​column​: ​int​) -> ​double​

​ ​set​

​ }​}

matrix提供了帶兩個引數(rows 和columns)的構造方法,建立了乙個足夠容納rows*columns個值的double陣列。其中的每個位置都被給另乙個初始值0.0.為了達到這個目的,陣列的大小和每個位置的初始值被作為初始化引數傳遞進來。關於初始化方法的更多資訊,參見creating and initializing an array。

可以根據行列的數目來建立乙個新的matrix例項:

​var​ ​matrix​ = ​matrix​(​rows​: ​2​, ​columns​: ​2​)

上面的例子建立了乙個matrix例項,它有兩行兩列。matrix例項的grid陣列是乙個平的矩陣,讀取它要從左上到右下:

傳遞行和列的值(用逗號分割他們)給下標,可以對矩陣中的值進行設定:

​matrix​[​0​, ​1​] = ​1.5

​matrix​[​1​, ​0​] = ​3.2

這兩句呼叫了下標的setter給矩陣右上角的位置(row 是0,column是1)設定了值1.5,給左下角的位置(row是1,column是0)設定了值3.2:

matrix下標的getter和setter都含有乙個檢查下標的row 和column是否合法的斷言。為了支援這個斷言,matrix提供了乙個方便呼叫的方法叫做indexisvalidforrow(_:column:),這個方法檢查了請求的row和column是否在矩陣的範圍內:

​func​ ​indexisvalidforrow​(​row​: ​int​, ​column​: ​int​) -> ​bool​
如果嘗試訪問超過矩陣範圍的下標,斷言就被觸發:

​let​ ​somevalue​ = ​matrix​[​2​, ​2​]

​// this triggers an assert, because [2, 2] is outside of the matrix bounds

翻譯 Swift程式語言 關於Swift

swift是一門用於ios和os x應用開發的新的程式語言,它以c和objective c語言為基礎,但沒有c語言的相容性約束。swift採用了安全的程式設計模式並且新增了能夠讓程式設計更加簡單 靈活和富有樂趣的現代化特性。swift是白紙一張,再加上有成熟而且深受喜愛的cocoa和cocoatou...

Swift程式設計十三(下標)

類,結構和列舉可以定義下標,下標是用於訪問集合,列表或序列的成員元素的快捷方式。可以使用下標按索引設定和檢索值,而無需單獨的設定和檢索方法。例如,可以使用somearray index 在array例項中和使用somedictionary key 在dictionary例項訪問元素。可以為單個型別定...

詳解Swift程式設計中下標的用法

訪問乙個集合的元素成員,在類中的序列和列表,結構和列舉都可以使用下標。這些下標用於儲存和使用索引來檢索值。陣列元素可使用如 somearray index 在 dictionary 例項及其後續成員元素的訪問也可以使用如 somedicitonary key 對於單一型別,下標範圍可以從單一到多個宣...