Subscripts: 指標程序, 索引, 子件, 子程序
分類(class),結構(struct)及列舉(enum)等所生生的型別可以用來定義出子程序,而這些型別所產生的個體,可以透過類似中括號內索引的方式取得個體的成員, 他的語法定義與實體程序(instance method是相同的, 子程序有兩個預設成員 get 及 set(newValue), 該程序與運算式屬性(computed property)語法也是相同的,如果定義多個子程序, 就可以讓它根據不同的輸入型別採取不同的動作, 這種稱為子程序過載 subscript overloading, 使用關鍵字 subscript 來定義子程序.例如
class newClass {
subscript(a:Int) -> Int{
get {
}
set(newValue) {
}
}
}
就像唯讀型運算式屬性那樣, 子程序如果沒有 set 成員時, 同樣可以移除 get 關鍵字, 形成最簡單的子程序語法,而它就稱為唯讀型子程序, 例如下面最簡單的子程序過載
class newClass {
subscript(i:Int) -> Int {
return i
}
subscript(a:String) -> String {
return i
}
}
let a=newClass() // a[i] = i
子程序可以輸入任何型別任何數量參數, 參數也可以是不定長度的, 也可以傳回任何型別, 但不能用 in-out 參數, 或是使用預設參數值
多參數的子程序運用在二維方陣上就是一個很好的例子
class: 分類
分類與其他型別最大不同就是可以繼承,被繼承者稱為父類別(superclass), 繼承者稱為子類別(subclass), 沒有繼承任何類別者稱為基礎類別(baseclass). 當定義類別時, 在新類別名稱後面加上 ":父類別" 便可以繼承來自父類別的各種屬性及方法, 在swift 裡只可以繼承一個類別但可以引用多個協定, 而父類別要擺在第一個, 其它協定則以逗號相互隔開跟隨其後. 如果要用父類別的屬性或方法使用 super加句點語法直接取用, 如要覆蓋父類別的屬性或方法, 使用關鍵字 override 加諸在父子都有的名稱之前.
對於所繼承的屬性如果是唯讀屬性的話, 可以透過 override 並提供新的 get 及 set 變成可讀寫的屬性,但不能將繼承而來的可讀寫屬性變成唯讀屬性. 透過覆蓋屬性(override property)可以替屬性適當的添加屬性觀察者, 但不能對所繼承的常數儲存式屬性(constant stored property)或是唯讀型運算式屬性(read-only computed property)添加屬性觀察者, 因為這些繼承來的屬性都不能被修改. 另外對於所繼承的屬性也不可將它的屬性觀察者(property observer)及設定者(settert)
同時覆蓋. 為了避免被覆蓋, 利用關鍵字 final 加諸再前, 可以避免被繼承. 另外將關鍵字 required 加在 func 前面時將會強制繼承者必須實現該方法.
新型別的分類名稱尾隨加上左右雙括號()便可形成新個體, 稱為 class instance
沒有留言:
張貼留言