Swift專題講解二十一——協議

Swift專題講解二十一——協議

1、引言

        協議約定了一些屬性與方法,其做用相似Java中的抽象類,Swift中類型經過遵照協議來實現一些約定的屬性和方法。Swift中的協議使用protocol關鍵字來聲明。Swift中的協議還有一個十分有意思的特性,協議能夠經過擴展來實現一些方法和附加功能。javascript

2、在協議中定義屬性和方法

        協議中定義的屬性只約定名稱和類型,在具體類型的實現中,其能夠是存儲屬性也能夠是計算屬性,協議中還須要指定屬性是可讀的仍是可讀可寫的。示例代碼以下:java

protocol MyPortocol {
    //定義實例屬性
    //可讀的
    var name:String{get}
    //可讀可寫的
    var age:Int{set get}
    //可讀的
    var nameAndAge:String{get}
    static var className:String{get}
}
class MyClass: MyPortocol {
    var name: String
    var age: Int
    var nameAndAge: String{
        get{
            return "\(name)"+"\(age)"
        }
    }
    static var className: String{
        get{
            return "MyClass"
        }
    }
    init(){
        name = "HS"
        age = 24
    }
}

有一點須要注意,協議中的可讀並非只讀,協議中的屬性約定成可讀可寫,則在實現時,這個屬性必須是可讀可寫的,可是若是協議中約定成可讀的,則此屬性能夠是隻讀的也能夠是可讀可寫的,看具體的實現。函數

        協議中約定的方法能夠是實例方法也能夠是類型方法,示例以下:spa

protocol MyPortocol {
    func logName()
    static func logClassName()
}
class MyClass: MyPortocol {
    var name: String
    var age: Int
    init(){
        name = "HS"
        age = 24
    }
    func logName() {
        print(name)
    }
    static func logClassName() {
        print(className)
    }
}

一樣,協議中也能夠對構造方法進行定義約定。code

3、協議的特色

        協議中雖然沒有任何屬性和方法的實現,可是其仍然能夠當作類型來使用,在函數參數、返回值中應用普遍,示例以下:繼承

protocol MyPortocol {
    //定義實例屬性
    var name:String{get}
    var age:Int{set get}
    var nameAndAge:String{get}
    static var className:String{get}
    func logName()
    static func logClassName()
}
//將協議類型做爲參數
func test(param:MyPortocol)  {
    param.logName()
}

協議做爲類型這種用法另外一個應用點是在集合類型中,協議能夠做爲全部遵照此協議的集合類型。ip

        協議能夠像其餘類型同樣進行繼承,子協議將自動擁有父協議約定的屬性和方法。協議也能夠經過class關鍵字來定義只有類能夠進行遵照,示例以下:get

protocol MyPortocol {
    //定義實例屬性
    var name:String{get}
    var age:Int{set get}
    var nameAndAge:String{get}
    static var className:String{get}
    func logName()
    static func logClassName()
}
//只有類能夠繼承此協議
protocol MySubPortocol:class,MyPortocol {
    
}

        協議既然能夠像其餘類型同樣進行使用,固然它也可使用is,as?,as!進行檢查和轉換,關於is,as的更多用法能夠查看Swift關於類型轉換的內容。it

        協議也可定義其中的屬性或方法爲可選的,即遵照此協議的類能夠實現也能夠不實現可選的屬性和方法,然而,聲明爲可選的須要此協議爲@objc類型的,示例以下:io

@objc protocol MyPortocol {
    //定義實例屬性
    var name:String{get}
    var age:Int{set get}
    var nameAndAge:String{get}
    static var className:String{get}
    func logName()
    //可選實現
    optional static func logClassName()
}

        Swift中的協議還有一個十分重要的特性,其能夠經過擴展來進行屬性、方法以及下標的實現。這對於一些通用類的方法十分方便,這至關於全部繼承此協議的類都默認實現了這樣的方法,示例以下:

protocol MyPortocol {
    //定義實例屬性
    var name:String{get}
    var age:Int{set get}
    var nameAndAge:String{get}
    static var className:String{get}
    func logName()
    static func logClassName()
}
extension MyPortocol{
    var name:String{
        return "HS"
    }
}

專一技術,熱愛生活,交流技術,也作朋友。

——琿少 QQ羣:203317592

相關文章
相關標籤/搜索