下標swift允許我們為 類,結構體,枚舉 定義下標,以更便捷的方式訪問一大堆屬性。比如Array和Dictionary都是結構體,swift的工程師已經為這兩個類型提供好了下標操作的代碼,所以,我們才可以通過 myArray[2]這種方式,讀取和改寫這個struct中儲存的資料。而且,一個類型中可以定義多種下標訪問方式(重載,關於重載,在後面的筆記中會提到,這裡先不用太在意)
下標可以定義為“讀寫”型的,也可以定義為”唯讀”型,這種行為,是通過定義一組操作完成的,這與之前筆記中提到過的用於計算的屬性的setter和getter是一樣的:
下標定義形式:
“讀寫”型:subscript(index: Int) -> Int { get {
} set(newValue) {
}}
“唯讀”型:subscript(index: Int) -> Int { //前面的筆記中有提到,因為只有一個get方法,是可以省掉get{ 與 }的。}
官方的例子:
定義了一個叫 TimesTable的結構體,它有一個“唯讀”型下標的定義,通過下標文法,可以取得到multiplier那麼多倍的index值。。。因為那是 multiplier * index嘛。。。。所以,最後一個println的結果是18.(multiplier的值被初始化為3, 3*6 = 18)
下標可以使用任何類型做為輸入參數,也就是說,我們可以把class, struct, enum, Int, Double, String 等等,當做下標的參數使用,但是這個參數不能是in-out類型的,也不能有預設值。
前面的筆記中沒有提到過任何關於“多維陣列”的詞,也沒有相關的例子,因為我也不知道怎麼弄,囧。但是有了自訂下標的話,就不一樣了,事情就變得簡單了,一切由我們自己說了算,不管是二維,三維,四維,任何維度上儲存什麼類型等等,一切都由我們自己說了算, 拿二維數組來舉例(其實是官方的例子):
定義了一個矩陣類型 Matrix, 通過var grid: Double[] 的使用可以看到, 第7行,定義了一個一維的Array來儲存所有的資料。 第12行開始定義了下標的訪問行為, 可以get, 也可以set, 所以這個下標是個“讀寫”型的。根據下標的參數 row和 column可以計算出我們要訪問的元素的在Array中的位置,通過Array的下標可以直接讀取或者寫入我們的資料。
var myMatrix = Matrix(row: 2, columns: 2)myMatrix[0, 0] = 8
println(myMatrix[0, 0]) //得到8
至此,我們就可以開始快樂的使用二維數組了~~~多維的也一樣