Swift中文教程(十二) 下標

2021-08-27 17:47:15 字數 2795 閱讀 6722

類,結構和列舉型別都可以通過定義下標來訪問一組或者乙個序列中的成員元素。通過下標索引就可以方便地檢索和設定相應的值,而不需要其他的額外操 作。比如你可以通過somearray[index]來訪問陣列中的元素,或者somedictionary[key]來對字典進行索引。

你可以為乙個型別定義多個下標,以及適當的下標過載用來根據傳遞給下標的索引來設定相應的值。下標不僅可以定義為一維的,還可以根據需要定義為多維的,多個引數的。

1、下標語法

下標可以讓你通過例項名後加中括號內乙個或多個數值的形式檢索乙個元素。語法和方法語法和屬性語法類似,通過使用subscript關鍵定義,乙個 或多個輸入引數以及乙個返回值。不同於例項方法的是,下標可以是可讀寫的或者唯讀的。這種行為通過乙個getter和setter語句聯通,就像是計算屬 性一樣。

subscript(index: int) -> int 

set(newvalue)

}

newvalue的型別和下標返回的型別一樣。和計算屬性一樣,你可以選擇不指定setter的引數,因為當你不指定的時候,預設引數newvalue會被提供給setter。

subscript(index: int) -> int
下面是乙個唯讀下標的實現,定義了乙個timestable結構來表示乙個整數的倍數表:

struct timestable 

}let threetimestable = timestable(multiplier: 3)

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

// prints "six times three is 18"

在這個例子中,例項timestable被建立為3倍數表,這是通過在初始化的時候為multiplier引數傳入的數值3設定的。

注意:倍數表是根據特定的數學規則設定的,所以不應該為threetimetable[someindex]元素設定乙個新值,所以timestable的下標定義為唯讀。

2、下標的使用

下標的具體含義由使用它時的上下文來確定。下標主要用來作為集合,列表和序列的元素快捷方式。你可以自由的為你的類或者結構定義你所需要的下標。

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

numberoflegs["bird"] = 2

上面的例子中定義了乙個變數numberoflegs,然後通過鍵值對初始化。numberoflegs的型別是字典型別 dictionary。在字典建立之後,例子使用了下標賦值方法新增了乙個型別為字串的鍵」bird」和int值2到字典中。

注意:swift中字典型別實現的鍵值對下標是可選型別。對於numbero***es字典來說,返回的值是int?,也就是可選int值。字典的這種使用可選型別下標的方式說明不是所有的鍵都有對應的值。同樣也可以通過給鍵賦值nil來刪除這個鍵。

3、下標選項

下標可以接收任意數量的引數,引數的型別也可以各異。下標還可以返回任何型別的值。下標可以使用變數引數或者可變引數,但是不能夠使用輸入輸出引數或者提供預設引數的值。

類或者結構可以根據需要實現各種下標方式,可以在需要的時候使用合適的下標通過中括號中的引數返回需要的值。這種多下標的定義被稱作下標過載。

當然,最常見的下標用法是單個引數,也可以定義多個引數的下標。下面的例子演示了乙個矩陣matrix結構,它含有二維的double值。矩陣結構的下標包括兩個整形引數:

struct matrix 

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

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

set }}

矩陣matrix提供了乙個初始化方法,使用兩個引數rows和columns,然後建立了乙個陣列來儲存型別為double的值 rows*columns。每個矩陣中的位置都被設定了乙個初始值0.0。通過傳遞初始值0.0和陣列長度給陣列初始化方法完成上述操作。陣列的初始化方 法在:建立和初始化陣列中有更詳細的敘述。

你可以傳遞兩個引數row和column來完成matrix的初始化:

var matrix = matrix(rows: 2, columns: 2)
上面的初始化操作建立了乙個兩行兩列的矩陣matrix例項。這個矩陣例項的grid陣列看起來是平坦的,但是實際上是矩陣從左上到右下的一維儲存形式。

matrix[0, 1] = 1.5

matrix[1, 0] = 3.2

這兩個語句呼叫了下標的setter方法為右上和左下角的兩個元素分別賦值1.5和3.2

矩陣下標的getter和setter方法都包括了乙個斷言語句來檢查下標row和column是否有效。通過indexisvalid方法來判斷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

感謝翻譯小組成員:李起攀(

微博)、若晨(

微博)、yao、粽子、山有木兮木有枝、渺-bessie、墨離、矮人王、cxh、tiger大顧(微博)

**:

Swift中文教程(十二) 下標

進行索引。你可以為乙個型別定義多個下標,以及適當的下標過載用來根據傳遞給下標的索引來設定相應的值。下標不僅可以定義為一維的,還可以根據需要定義為多維的,多個引數的。1 下標語法 和方法語法和屬性語法類似,通過使用subscript關鍵定義,乙個或多個輸入引數以及乙個返回值。不同於例項方法的是,下標可...

Swift中文教程1

swift語言概覽 基本概念 注 這一節的 源自the swift programming language中的a swift tour。hello,world 類似於指令碼語言,下面的 即是乙個完整的swift程式。swift使用var宣告變數,let宣告常量。型別推導 swift支援型別推導 t...

Swift中文教程3

呼叫方法 swift中,函式的引數名稱只能在函式內部使用,但方法的引數名稱除了在內部使用外還可以在外部使用 第乙個引數除外 例如 注意swift支援為方法引數取別名 在上面的 裡,numberoftimes面向外部,times面向內部。的另一種用途 使用可空值時,可以出現在方法 屬性或下標前面。如果...