十一
.使用協議作為型別
1. 協議也相當於一種型別,與列舉、結構體、類相比,協議相當於一種抽象的型別,它被徹底抽象成只定義規範,不負責實現。因此定義協議之後,就可以像列舉、結構體、類那樣當作型別來使用,
只是協議不能直接用於建立例項,協議可以做如下方面的用途:(
1)可使用協議宣告變數(2
)可使用協議作為函式、方法、構造器的形參型別、返回值型別(3
)可使用協議作為is、
as等運算子的
***後
***
乙個運算元
2. 舉個栗子:
protocol eatable
//實現
eatable
協議struct pie : eatable
//結構體使用
static
修飾型別方法
static func test (msgs : string…)}}
//定義例項方法
func taste()
//類使用
class
修飾型別方法
class func test (msgs : string...)}
//使用
eatable
宣告變數,將
例項賦值給
food
,這是向上轉型
紅富士")
//使用
eatable
宣告變數,將
pie例項賦值給
food
,這是向上轉型
var food2 : eatable = pie(weight : 1.2)
//分別呼叫
food1
,food2
裡面的方法,這是多型
food1.taste()
food2.taste()
//定義乙個函式,該函式的形參是個數可變的
eatable
型別的形參
func eat(foods : eatable...)}//
由於該函式的引數要求是
eatable
型別,所以既可以傳入
,也可以傳入
pie
//宣告並反問
eatable
型別的陣列
for food in foodarray
else let pie = food as? pie}
3. 通過上面可以看出,實現某個協議時,也整合某個類的本質是一樣的,協議的實現型別,也相當於協議的特殊子類,因此協議實現型別的例項,完全可以當成協議例項使用。
4. 一般來說,程式通常應該面向協議程式設計,就像其他語言倡導的面向介面程式設計一樣,面向協議程式設計能提供更好的靈活性,這也是多型的價值所在。 十二
.合成協議
1. swift
還允許將多個協議合成乙個臨時的型別,這種用法被為合成協議。合成協議的語法格式為:
protocol《協議1
,協議2,
協議3,....>
2. 對於採用這種合成協議宣告的變數、定義的引數、宣告的返回值,必須同時實現合成協議裡面的所有協議。
十三.通過擴充套件為已有的型別新增協議
1. 前面已經知道通過擴充套件可以為已有的型別新增計算屬性、方法、下標、構造器等。不僅如此,使用擴充套件還可以為已有的型別新增協議。
2. 舉個栗子:下面的**通過擴充套件讓
string
實現eatable
協議。extension string : eatable
class func test()}
3. 在某些極端情況下,如果已有型別已經實現了協議中的要求,則可以更簡單地通過擴充套件讓該型別實現這個協議
————
此時擴充套件的花括號內不需要任何**
4. 舉個栗子:
protocol emptyable}
extension string : emptyable{} //
定義乙個方法,該方法需要
emptyable
引數func foo(arg: empayable)
//呼叫
foo方法,傳入
string
即可,(因為
string
實現了emptyable
協議)foo("abc")
foo("")
十四.唯類協議
1. swift
還支援定義一種唯類協議,這種協議
**只能被類實現,不能被列舉、結構體實現,如果程式中使用列舉、結構體實現唯類協議,編譯器會報錯。
2. 定義唯類協議非常簡單,只要在定義協議的協議名後面的冒號後面緊跟
class
關鍵字即可(
class
放在所有父協議的第一位):
protocol
協議名:
class
,父協議1,
父協議2,...
3. 唯類協議中無須定義
mutating
方法(定義了也沒用,因為只有類才能實現唯類協議,類的方法本身就可以修改例項屬性),除此之外,唯類協議與普通協議基本相同。
4. 使用唯類協議的優勢在於
:swift
總是將唯類協議當成引用型別處理,而不會當成值型別處理。這是因為唯類協議的實現者只能是類,因此肯定是引用型別。
5. 舉個栗子:
protocol movable : class
class car : movable}
struct bee : movable ----
這裡將會報錯
}var move : movable? = nil
上面的**中,由於
movable
是乙個唯類協議,因此系統可以直接將
move
變數當成引用型別處理。
每天學一點Swift 物件導向下 二
二 類的構造和析構 1.通過整合後,子類中不僅有父類中的儲存屬性,還有子類自己的儲存屬性。子類中的所有儲存屬性都必須在構造器中設定初始值,因此類的構造過程會相對比較複雜。2.與構造器相反的是,swift 允許為類 列舉 結構體不允許 定義析構器 在例項臨近銷毀之前,系統會自動呼叫該例項的析構器 例項...
每天學一點Swift 物件導向下 十
十九 swift 記憶體管理 1.swift 提供了強大的記憶體管理機制 swift 通過自動引用計數 arc 可以很好地管理物件的 大部分時候,程式無須關心 swift 物件的 但在某些特殊情況下,swift 要求程式設計師進行一些記憶體管理的處理。2.只有引用型別變數所引用的物件才需要使用引用計...
每天學一點Swift 物件導向上 十二
十四 構造器 1.構造器用於完成例項的構造過程。這個過程包括為例項中的每個儲存屬性設定初始值和執行必要的準備和初始化任務。2.swift 的構造器本質上就是乙個或多個名為 init 的函式 不允許使用 func 關鍵字 3.構造器的主要作用就是完成例項中每個類 結構體中例項儲存屬性 列舉不能定義例項...