中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

協議

發布時間:2020-07-10 09:41:52 來源:網絡 閱讀:288 作者:hehemmm 欄目:開發技術

        如果類的所有方法都是抽象的,在Swift和Object-C中稱為協議,在Java語言中稱為接口,在C++中稱為純虛類;只有方法的定義沒有方法的具體實現,所在的類叫抽象類


        協議不能被實例化


        Swift和Object-C中實現抽象類的過程稱為遵守協議


一、聲明和遵守協議

        類、結構體和枚舉類型可以聲明與遵守某個協議,并提供該協議所需要的屬性和方法

        協議定義的語法如下:

            protocol 協議名 {

                //內容

}

            在聲明遵守協議時,格式如下:

             類型  類型名:協議1,協議2 {

                    //遵守協議內容

}

            類型包括類、結構體和枚舉,冒號后面是遵守的協議,如果有多個協議,協議之間用逗號隔開

            協議可以要求其遵守者提供實例屬性,靜態屬性,實例方法和靜態方法的實現,


二、協議方法


         協議可以要求其遵守者實現某些指定方法,包括實例方法和靜態方法,這些方法在協議中被定義,協議方法和普通方法類似,但不支持邊長參數和默認值參數,也不需要大括號和方法體


        1、實例協議方法

           

            protocol Figure {
                func onDraw()
}
             class Rectangle:Figure {
                    func onDraw(){
                        println("繪制矩形")
}
}
                class Circle:Figure {
                    func onDraw(){
                        println("繪制圓形")
}
}

        2、靜態協議方法


            在協議中定義靜態方法與在類中定義靜態方法一樣,方法前需要添加class關鍵字,在遵守該協議的時候,遵守者靜態方法前加class或者static,與遵守者類型有有關系,如果是類,關鍵字就是class,如果是結構體或枚舉,關鍵字就是static.

            protocol Account {
                    class func interestBy(amount:Double)->Double
}
            class ClassImp:Account {
                    class func interestBy(amount:Double)->Double {
                    return 0.668 * amount
}
}
            class StructImp:Account {
                            static func interestBy(){
                                      return 0.668 * amount   
    }        
}

        3、變異方法

            在結構體和枚舉類型中可以定義變異方法,而在類中沒有這種方法,原因是結構體和枚舉中的屬性是不可修改,通過定義變異方法,可以修改這些屬性,而類是引用類型,不需要變種方法就可以修改自己的屬性;

            在協議定義變種方法時,方法前要加上mutating關鍵字,類、結構體和枚舉都可以實現變異方法,類實現變異方法時,前面不需要加mutating關鍵字,結構體和枚舉在實現變異方法時,前面需要加mutating關鍵字

            protocol Editable {
                mutating func edit()
}
            class ClassImp:Editable{
                var name = "ClassImp"    
                func edit(){
                        println("編輯ClassImp...")
                        self.name = "編輯ClassImp"                    
    }
}
            struct StructImp:Editable {
                    var name = "StructImp"
                mutating func edit(){
                        println("編輯StructImp")
                        self.name = "編輯StructImp"
}
}

       

     struct Enum:Editable {
                    case Monday
                    case Tuesday
                    case Wednesday
                    case Thursday
                    case Friday
                    mutating func edit(){
                        self = .Friday
        }
}


            4、實例協議屬性


                協議可以要求其遵守者實現某些指定屬性,包括實例屬性和靜態屬性,在具體定義的時候,每一種屬性都可以有只讀和讀寫之分


                對于遵守者而言,實例屬性時市場靈活的,無論是存儲屬性還是計算屬性,只要能通過協議屬性的要求,就可以通過編譯,甚至是協議中定義了只讀屬性,而遵守者提供了對該屬性的讀寫,這也是被允許的,因為遵守者通過了協議的只讀屬性要求,協議只規定了必須要做的事情,但沒有規定不能做的事情;


             protocol Person {
                    var firstName:String{get set}
                    var lastName:String {get set}
                    var fullName:String{get}
}
            class Employee:Person {
                    var no:Int = 0
                    var job:String?
                    var salary:Double = 0
                    
                    var firstName:String = "Tony"
                    var lastName:String = "zhang"
                    var fullName:String {
                            get {
                                return "\(firstName)\(lastName))"
}
                            set(newFullName){
                            var name = newFullName.componentsSeperatedByString(".")
                            self.firstName=name[0]
                            self.lastName=name[1]
                    }
            }
}

三、協議屬性

        在協議中定義靜態屬性與在協議中定義靜態屬性類型,屬性前面要加class關鍵字還是static,與遵守者類型有關系,如果是類,關鍵字是class,如果是結構體和枚舉,關鍵字是static

            protocol Account {
                class var interestRate:Double {get}
                class func interestBy(amount:Double)->Double
}
            class ClassImp:Account{
                class var interestRate:Double {
                        return 0.668
}
                class func interestBy(amount:Double)->Double{
                        return ClassImp.interestRate * amount
}
}
                 struct StructImp:Account {
                        static var interestRate:Double = 0.668
                        static func interestBy(amount:Double)->Double {
                                return StructImp.interestRate * amount
}
}

四、把協議作為類型使用

            雖然協議沒有具體的實現代碼,不能被實例化,但它的存在是為了規范其遵守者而設計的,它是面向接口編程必不可少的機制,面向接口編程的系統的定義與實現應該分離,協議作為數據類型暴露給使用者,使其不用關心具體的實現細節,從而提供系統的擴展性和復用性;

            在Swift中,協議作為數據類型使用,它可以出現在任意允許數據類型出現的地方:

            protocol Person {
                var firstName:String{get set}
                var lastName:String {get set}
                var fullName:String{get}
                fun description()->String 
}
           class Student:Person {
                    var school:String
                    var firstName:String
                    var lastName:String
                    var fullName:String {
                            return self.firstName + self.lastName
}
                    func description()->String {
                        return self.firstName+self.lastName+self.school
}
                    init(firstName:String,lastName:String,school:String){
                        self.firstName = firstName
                        self.lastName = lastName
                        self.schooll = school
}
}


五、協議的繼承

            一個協議繼承就像是類繼承一樣:

            

           protocol Person {
                var firstName:String{get set}
                var lastName:String {get set}
                var fullName:String{get}
                fun description()->String 
}
                        protocol Student:Person {
                                    var school:String
}
                        class Graduate:Student{
                                    
}

六、協議的合成

        多個協議可以臨時合并成一個整體,作為一個類型使用,首先要有一個類型在聲明時遵守多個協議

        

        protocol Ship {
                var displacement:Double {get set}
}
        protocol Weapon {
                 var gunNumber{get set}
}
        class WarShip:Ship,Weapon{
                    var displacement = 100000.00
                    var gunNumber = 10
}
        func showWarResource(resource:protocol<Ship,Weapon>){
                    println("\(resource.displacement):\(resource.gunNumber)")
}
    let ship = WarShip()
    showWarResource(ship)


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

集安市| 潼南县| 济阳县| 平湖市| 金门县| 阳原县| 西和县| 云霄县| 河津市| 南靖县| 阿鲁科尔沁旗| 南皮县| 西畴县| 广丰县| 平凉市| 余姚市| 新巴尔虎左旗| 怀柔区| 灯塔市| 寿光市| 若羌县| 建始县| 黄平县| 怀柔区| 全州县| 波密县| 桦南县| 道孚县| 四川省| 长沙县| 宜州市| 柳江县| 崇仁县| 沙坪坝区| 武平县| 上高县| 八宿县| 三都| 将乐县| 三亚市| 彩票|