Swift之協議

協議規定了用來實現某一特定任務或者功能的方法、屬性,以及其他需要的東西。類、結構體或枚舉都可以遵循協議,并為協議定義的這些要求提供具體實現。

一、協議語法(定義方式與類、結構體和枚舉的定義相似)

protocol MyProtocol {
    // 協議定義的內容
}

二、遵循協議
1:遵循多個協議時,各協議之間用逗號隔開

// 類遵循協議 MyProtocol
class WriteDemo: MyProtocol {
    
}

// 結構體遵循協議 MyProtocol
struct ShowHeart:MyProtocol {
    
}

// 類遵循多個協議
class WriteDemo: MyProtocol, AnotherProtocol {
    
}

三、協議&屬性
1、如果協議中定義了屬性,必須要求遵循協議的類型,提供對應名稱和類型的屬性;
2、協議還指定屬性是可讀的還是可讀可寫的;
3、協議總是用 var 關鍵字來聲明變量屬性,在類型聲明后加上 { set get } 來表示屬性是可讀可寫,可讀屬性則用 { get } 來表示。

protocol MyProtocol {
    var name: String {set get}
}

class WriteDemo: MyProtocol {
    var name: String 
    init(name: String) {
        self.name = name
    }
}

struct ShowHeart:MyProtocol {
    var name: String
}

let writeDemo = WriteDemo(name: "Xiao Wei")
let showHeart = ShowHeart(name: "Li Hua")

四、協議&方法
1、協議可以要求遵循協議的類型實現該協議指定的實例方法或類方法;
2、方法作為協議的一部分,像普通方法一樣放在協議的定義中,但是不需要大括號和方法體
3、在協議中定義類方法的時候,總是使用 static 關鍵字作為前綴。

實例方法:

protocol MyProtocol {
    func PrintWorld()
}

class WriteDemo: MyProtocol {
    func PrintWorld() {
        
    }
}

struct ShowHeart:MyProtocol {
    func PrintWorld() {
        
    }
}

let writeDemo = WriteDemo()
writeDemo.PrintWorld()

類方法(使用 static 關鍵字作為前綴):

protocol MyProtocol {
    static func PrintWorld()
}

class WriteDemo: MyProtocol {
    static func PrintWorld() {
        
    }
}

struct ShowHeart:MyProtocol {
    static func PrintWorld() {
        
    }
}

WriteDemo.PrintWorld()

五、協議 & 構造器
協議要求遵循協議的類型實現協議中指定的構造器,必須為構造器實現標上 required 修飾符

protocol MyProtocol {
    init()
}
class WriteDemo: MyProtocol {
    required init() {
    }
}

如果類已經被標記為 final,那么不需要在協議構造器的實現中使用 required 修飾符,因為 final 類不能有子類:

protocol MyProtocol {
    init()
}

final class WriteDemo: MyProtocol {
    init() {
        
    }
}

如果一個子類重寫了父類的指定構造器,并且該構造器滿足了某個協議的要求,那么該構造器的實現需要同時標注 required 和 override 修飾符:

protocol MyProtocol {
    init()
}

class ShowTheWorld: NSObject {
    override init() {
        
    }
}

class WriteDemo: ShowTheWorld, MyProtocol {
    required override init() {
        
    }
}

六、協議作為類型
1、協議可以被當做一個功能完備的類型來使用;
2、協議是一種類型,因此協議類型的名稱應與其他類型(例如 Int,Double,String)的寫法相同,使用大寫字母開頭的駝峰式寫法。

protocol MyProtocol {
    
}

class ShowTheWorld: NSObject {
    let myProtocol : MyProtocol
    init(myProtocol: MyProtocol) {
        self.myProtocol = myProtocol
    }
}

七、委托

八、擴展遵循協議
擴展可以為已有類型添加屬性、方法、下標以及構造器。

通過ShowTheWorld的擴展為ShowTheWorld類添加屬性:

protocol MyProtocol {
    var name :String {get}
}

class ShowTheWorld {
    
}

extension ShowTheWorld: MyProtocol{
    var name: String{
        return "name"
    }
}

let showWorld = ShowTheWorld()
showWorld.name
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容