Swift學(xué)習(xí)_協(xié)議2與代理模式

Swift

1.協(xié)議的繼承

protocol Animal{
    
    // 腿和翅膀?qū)傩?,包括get和set方法
    var leg:String{get set}
    var wing:String{get set}
    // 描述方法,返回的是字符串
    func description() -> String
}

protocol Fish:Animal {
    
    // 習(xí)慣屬性,帶有g(shù)et和set
    var habit:String{get set}
}

// Goldfish類采納Fish協(xié)議
class Goldfish:Fish{
    
    var name:String
    // 實現(xiàn)Fish的協(xié)議
    var habit: String
    
    // 實現(xiàn)Animal協(xié)議
    var leg: String
    var wing: String
    func description() -> String {
        
        return "name:\(name),wing:\(wing),leg:\(leg),habit:\(habit)"
    }
    
    // 構(gòu)造函數(shù)
    init(name:String,habit:String,leg:String,wing:String){
        
        self.name = name
        self.habit = habit
        self.leg = leg
        self.wing = wing
    }
}

var goldfish = Goldfish(name:"fish",habit:"喜歡水",leg:"沒有腿",wing:"沒有翅膀")
print(goldfish.description())

2.檢查協(xié)議的一致性

使用is操作符檢查實現(xiàn)實例是否采納了某個協(xié)議
使用as操作符把實例類型轉(zhuǎn)換到指定協(xié)議類型

protocol Area{
    
    var area:Double{get}
}

// 定義采納Area協(xié)議的類Rectangle
class Rectangle:Area{
    
    let long:Double
    var area: Double{return long * long}
    init(long:Double) {
        
        self.long = long
    }
}

// 定義采納了Area協(xié)議的類Circle
class Circle:Area{
    
    let pi = 3.1415926
    var radius:Double
    var area: Double{return pi * radius * radius}
    
    init(radius:Double){
        self.radius = radius;
    }
}

// 定義了沒有采納Area協(xié)議的類Bird
class Bird{
    
    var wing:Int
    init(wing:Int){
        self.wing = wing
    }
}

// 定義AnyObject類型的數(shù)組
let objects:[AnyObject] = [Circle(radius:2.0),Rectangle(long:2.0),Bird(wing:2)]

for object in objects {
    
    if let objectWithArea = object as? Area{
        
        print("面積是:\(objectWithArea.area)")
    }else{
        
        print("沒有面積")
    }
}

3.代理模式

代理是一種設(shè)計模式,它允許類或者結(jié)構(gòu)體將自身負責(zé)的功能委托給其他類型的實例去實現(xiàn)。

// 定義一個協(xié)議GetFile
protocol GetFileDelegate{
    
    func take() -> String           // 協(xié)議方法
}

// 定義Assistant類,采用GetFile協(xié)議
class Assistant:GetFileDelegate{
    
    func take() -> String {
        
        return "助理給老板拿文件"
    }
}

// 定義一個Boss類,它有一個代理屬性
class Boss{
    
    var delegate:GetFileDelegate?        // 聲明代理屬性,用來響應(yīng)代理方法
    init(man:GetFileDelegate) {
        
        delegate = man
    }
    func take() -> String {
        
        return delegate!.take()  // 實現(xiàn)代理的方法
    }
}

let assistant = Assistant()
let boss = Boss(man:assistant)
print(boss.take())

協(xié)議2結(jié)果輸出

代碼已上傳至git:
--> 傳送門:Swift_基本語法

附錄

查看完整專欄《Swift學(xué)習(xí)》

有問題歡迎指正以及相互探討 —— CoderSun

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容