swift中的協(xié)議用于定義方法和屬性,但是協(xié)議本身并不進(jìn)行實(shí)現(xiàn)提佣,而是由采納該協(xié)議的類進(jìn)行實(shí)現(xiàn)吮蛹。
一、協(xié)議里邊可以定義屬性镐依、方法匹涮、構(gòu)造函數(shù)等。
1.對(duì)于可讀可寫(xiě)的屬性槐壳,則實(shí)現(xiàn)屬性不能使常量存儲(chǔ)屬性或只讀的計(jì)算型屬性
2.對(duì)于只讀的屬性然低,則實(shí)現(xiàn)屬性可以是任意類型的屬性
3.允許為只讀屬性實(shí)現(xiàn)有效的setter方法
protocol PersonProtocol{
var age:Int{get set} //聲明為可讀可寫(xiě)屬性
var name:String{get} //聲明為只讀屬性
static var sex:String{get set} //聲明為類型屬性
}
protocol Person{
var fullName:String {get}
func description()
//可變方法
//結(jié)構(gòu)體和枚舉能夠通過(guò)采納協(xié)議,對(duì)協(xié)議的可變方法進(jìn)行實(shí)現(xiàn)务唐,從而改變本身的值雳攘。而類在實(shí)現(xiàn)可變方法時(shí),要省略mutation關(guān)鍵字
mutating func descriptionM()
init(name:String, fullName:String)
}
class Teacher : Person{
var name:String
init(name:String) {
self.name = name
}
var fullName: String{
return self.name+"全"
}
func description() { //普通方法枫笛,類方法一樣
print("I am description")
}
func descriptionM(){
self.name = "王"
print(self.name,"全")
}
//如果需要實(shí)現(xiàn)協(xié)議里邊的構(gòu)造方法必須加上required關(guān)鍵字吨灭,是為了保證該類的所有子類要滿足協(xié)議的要求
//如果該類有final修飾 則不用加required關(guān)鍵字,因?yàn)閒inal修飾的類不能被繼承
required init(name: String, fullName: String) {
self.name = name
}
}
let tea = Teacher(name:"小李子")
print(tea.fullName)
tea.description()
tea.descriptionM()
let tea2 = Teacher(name:"小陳", fullName:"小袁")
print(tea2.name)
//可選協(xié)議刑巧, 只能被類采納
import UIKit
@objc protocol Animal{
//定義可選方法 類可自動(dòng)選擇是否實(shí)現(xiàn)該方法
@objc optional func run()
}
class Cat : Animal{
@objc func run() {
print("run")
}
}
let cat = Cat()
cat.run()
控制臺(tái):
小李子全
I am description
王 全
小陳
run
二喧兄、協(xié)議作為類型使用
下邊列舉一個(gè)例子,把協(xié)議當(dāng)做參數(shù)來(lái)使用啊楚,其實(shí)就是該參數(shù)需要傳入一個(gè)采納了該協(xié)議的類或結(jié)構(gòu)體或枚舉的實(shí)例
//協(xié)議作為類型使用
protocol Name{
var name:String{get}
}
class Person:Name{
var name: String{
return "name"
}
}
func A(param:Name){
print(param.name)
}
A(param:Person())
控制臺(tái):
name
協(xié)議的合成吠冤,如果多個(gè)協(xié)議當(dāng)做類型使用時(shí),方法如下
protocol A(){}
protocol B(){}
func C(param:protocol<A,B>){}
//這時(shí)候調(diào)用C方法就需要傳入一個(gè)同時(shí)采納了AB兩個(gè)協(xié)議的實(shí)例
三恭理、協(xié)議的繼承
協(xié)議之間也可以繼承拯辙,跟類的繼承相似,但是協(xié)議允許多繼承颜价。用逗號(hào)分隔
protocol A : B,C(){}//A協(xié)議繼承了B涯保、C兩個(gè)協(xié)議
四、檢查協(xié)議的一致性
- 使用is操作符檢查實(shí)例是否采納了某個(gè)協(xié)議
- 使用as操作符把實(shí)例類型轉(zhuǎn)換到指定的協(xié)議類型
這里簡(jiǎn)直跟類里邊的使用方法一模一樣周伦,不再贅述
is操作符
as操作符
五夕春、代理模式
講到代理模式就厲害了,我很喜歡這個(gè)横辆,也比較容易學(xué)撇他。
看下邊的代碼 簡(jiǎn)直是通俗易懂茄猫,高大上
protocol Take{
func take()
}
class Student:Take{
func take(){
print("student去借粉筆")
}
}
class Teacher{
var delegate:Take
init(delegate:Take){
self.delegate = delegate
}
func talk(){
delegate.take()
}
}
let stu = Student()
let Tea = Teacher(delegate:stu)
Tea.talk()
控制臺(tái):
student去借粉筆