swift 12.1 協(xié)議

1簡(jiǎn)介

(1)協(xié)議就是用來(lái)規(guī)范雙方行為的
(2)swift語(yǔ)言中的協(xié)議作用是用來(lái)統(tǒng)一屬性拂酣、方法区宇、下標(biāo)的
(3)協(xié)議自身是不實(shí)現(xiàn)自身的內(nèi)容 由遵守協(xié)議的類(lèi)、結(jié)構(gòu)體捅伤、枚舉來(lái)實(shí)現(xiàn)

2作用:

(1)轴术、協(xié)議用來(lái)規(guī)范接口(方法)难衰、屬性、下標(biāo)
(2)逗栽、協(xié)議能夠間接實(shí)現(xiàn)多繼承
//OC數(shù)組中只能存放AnyObject類(lèi)型的數(shù)據(jù)
//Swift協(xié)議變量只是普通變量
//OC協(xié)議定義的變量就是AnyObject類(lèi)型

3格式

/*
 swift中協(xié)議的定義格式:
 
 protocal 協(xié)議名稱(chēng): 父協(xié)議1,父協(xié)議2... {
    協(xié)議的內(nèi)容
 }
 
 enum 枚舉名稱(chēng): 協(xié)議1盖袭,協(xié)議2... {
    實(shí)現(xiàn)協(xié)議中的方法
 }
 struct 結(jié)構(gòu)體名稱(chēng): 協(xié)議1,協(xié)議2... {
    實(shí)現(xiàn)協(xié)議中的方法
 }
 class 類(lèi)名: 協(xié)議1, 協(xié)議2... {
 
 }
 class 類(lèi)名: 父類(lèi)名稱(chēng)彼宠,協(xié)議1,協(xié)議2...{
    實(shí)現(xiàn)協(xié)議中的方法
 }
 */

4方法

(1)使用協(xié)議指定屬性

可以定義存儲(chǔ)屬性鳄虱、類(lèi)型屬性, 必須注明屬性的權(quán)限(get set)但是協(xié)議中定義的屬性無(wú)論是存儲(chǔ)屬性還是計(jì)算屬性 ,協(xié)議都是不做區(qū)分的。

protocol Drawer {
    var borderWidth: Double{get set} // 讀寫(xiě)屬性
    var borderColor: String{get}//只讀屬性
    //即使協(xié)議中屬性定義成只讀的 實(shí)現(xiàn)屬性的時(shí)候也可以添加set方法
}

//使用枚舉包括所有的顏色值
enum Color {
    case Blue
    case Red
    case Green
    case Yellow
}
//設(shè)置圖形的填充顏色
protocol FillColor {

    var backGroundColor: Color?{get}
}

//協(xié)議可以繼承
protocol GetArea: Drawer,FillColor {
    var area: Double {get}
}

class Rectangle: GetArea {
    var height: Double
    var width: Double
    init (height: Double,width: Double) {
        self.width = width
        self.height = height
    }
    var borderWidth: Double = 0.0
    var borderColor: String = "紅色"
    var backGroundColor: Color? = Color.Blue
    var area: Double {
        return self.width * self.height
    }
}
//協(xié)議中屬性無(wú)論怎么定義 遵守協(xié)議的類(lèi)可以對(duì)屬性進(jìn)行直接賦值或者使用計(jì)算屬性形式賦值和獲取
protocol FruitColor {
    static var color: String {get}
}
protocol FruitWeight {
    var weight: Double {get set}
}
class Fruit:FruitColor,FruitWeight {
    var weight: Double {
        get {
            return 1.23
        }
        set {
            print("我是Fruit類(lèi)")
        }
    }
    static var color: String = "綠色"
}
//協(xié)議規(guī)范了多個(gè)不同的類(lèi)具有相同的屬性和方法 和繼承很像

(2)使用協(xié)議指定行為

protocol iOSCoder {
    func writeiOSCoder()
    func deBug()
    static func reporting()
}
//遵守協(xié)議的類(lèi)凭峡、結(jié)構(gòu)體拙已、枚舉 必須實(shí)現(xiàn)協(xié)議中的方法
class iosMonkey: iOSCoder {
    func writeiOSCoder() {
        print("我會(huì)寫(xiě)ios代碼")
    }
    func deBug() {
        print("我有高深的調(diào)bug能力")
    }
    static func reporting() {
        print("我會(huì)非常認(rèn)真的對(duì)進(jìn)度")
    }
}
//[結(jié)論]一個(gè)協(xié)議可以由多個(gè)類(lèi)遵守 一個(gè)類(lèi)可以遵守多個(gè)協(xié)議 遵守多個(gè)協(xié)議的行為就是間接實(shí)現(xiàn)多繼承

(3)協(xié)議中可以指定下標(biāo)

protocol SubScriptPro {
    subscript(index: Int)->Int{get}
}
class Point: SubScriptPro {
    var x: Int
    var y: Int
    init (x: Int,y: Int) {
        self.x = x
        self.y = y
    }
    subscript(index: Int)->Int {
        get {
            switch index {
            case 0:
                return self.x
            default:
                return self.y
            }
        }
        set {
            switch index {
            case 0:
                self.x = newValue
            default:
                self.y = newValue
            }
        }
    }
}
var p = Point.init(x: 0, y: 0)
p[0] = 100
p[1] = 200
print(p[0],p[1])

(4)協(xié)議中指定構(gòu)造方法

protocol Initable {
    init(name: String)
    init(name: String,weight:Double)
    func run()
//    func test(name: String...)  ?
//    func tmp(name = "12345678") ??
    //[注意]協(xié)議中函數(shù)的形參可以定義成可變的 但是不能定義成固定的
}
class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}
class Man: Person,Initable {
    var weight: Double
    required convenience init(name: String, weight: Double) {
        //[注意]當(dāng)類(lèi)遵守協(xié)議 實(shí)現(xiàn)協(xié)議中的構(gòu)造方法 那么方法前面必須使用required修飾
//        self.weight = weight
//        super.init(name: name)
        self.init(name: name)
    }
    required override init(name: String) {
        //[注意]當(dāng)類(lèi)遵守協(xié)議 實(shí)現(xiàn)協(xié)議中的構(gòu)造方法 
//如果協(xié)議中的構(gòu)造方法和父類(lèi)中的構(gòu)造方法同名 那么方法前就要添加required override
        self.weight = 100.0
        super.init(name: name)
    }
    func run() {
        print("跑")
    }
    
}
//類(lèi)遵守協(xié)議 實(shí)現(xiàn)協(xié)議中的構(gòu)造方法 
//使用指定構(gòu)造器或者便利構(gòu)造器實(shí)現(xiàn)都是可以的 都需要在構(gòu)造器前添加required

(5)使用協(xié)議類(lèi)型定義變量、函數(shù)的形參摧冀、函數(shù)的返回值類(lèi)型

let xiaoMan1: Initable = Man.init(name: "hello")
let xiaoMan2: Initable = Man.init(name: "world", weight: 100.0)
func show(man: Initable...) {
    for i in man {
        i.run()
    }
}
show(xiaoMan1,xiaoMan2)

(6)規(guī)范方法/接口(協(xié)議的作用)

protocol Sum {
    func add(a: Int,b: Int)
}
protocol Sub {
    func subResult(a: Int,b: Int)
}
protocol Mul {
    func mulResult(a: Int,b: Int)
}
protocol Div {
    func divResult(a: Int,b: Int)
}
class Cal: Sum,Sub,Mul,Div {
    func add(a: Int,b: Int) {
        
    }
    func subResult(a: Int,b: Int) {
    
    }
    func mulResult(a: Int,b: Int) {
    
    }
    func divResult(a: Int,b: Int) {
    
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倍踪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子索昂,更是在濱河造成了極大的恐慌建车,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椒惨,死亡現(xiàn)場(chǎng)離奇詭異缤至,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)康谆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)领斥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沃暗,你說(shuō)我怎么就攤上這事月洛。” “怎么了描睦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵膊存,是天一觀的道長(zhǎng)导而。 經(jīng)常有香客問(wèn)我忱叭,道長(zhǎng)隔崎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任韵丑,我火速辦了婚禮爵卒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撵彻。我一直安慰自己钓株,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布陌僵。 她就那樣靜靜地躺著轴合,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碗短。 梳的紋絲不亂的頭發(fā)上受葛,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音偎谁,去河邊找鬼总滩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巡雨,可吹牛的內(nèi)容都是我干的闰渔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼铐望,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冈涧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起正蛙,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炕舵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后跟畅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體咽筋,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年徊件,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奸攻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虱痕,死狀恐怖睹耐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情部翘,我是刑警寧澤硝训,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響窖梁,放射性物質(zhì)發(fā)生泄漏赘风。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一纵刘、第九天 我趴在偏房一處隱蔽的房頂上張望邀窃。 院中可真熱鬧,春花似錦假哎、人聲如沸瞬捕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肪虎。三九已至,卻和暖如春惧蛹,著一層夾襖步出監(jiān)牢的瞬間笋轨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工赊淑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爵政,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓陶缺,卻偏偏與公主長(zhǎng)得像钾挟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饱岸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容