25-Swift面向協(xié)議編程

1.面向協(xié)議編程

  • 面向協(xié)議編程(Protocol Oriented Programming,簡稱POP)

    • 是Swift的一種編程范式册招, Apple于2015年WWDC提出
    • 在Swift的標(biāo)準(zhǔn)庫中,能見到大量POP的影子
  • 同時啊终,Swift也是一門面向?qū)ο蟮木幊陶Z言(Object Oriented Programming辈灼,簡稱OOP)

  • 在Swift開發(fā)中,OOP和POP是相輔相成的蒲牧,任何一方并不能取代另一方
    POP能彌補OOP一些設(shè)計上的不足

2.回顧OOP

  • 2.1 OOP的三大特性:封裝撇贺、繼承、多態(tài)

    • 繼承的經(jīng)典使用場合
    • 當(dāng)多個類(比如A冰抢、B松嘶、C類)具有很多共性時,可以將這些共性抽取到一個父類中(比如D類)挎扰,最后A翠订、B巢音、C類繼承D類
  • 2.2 OOP的不足

    • 但有些問題,使用OOP并不能很好解決尽超,比如
    • 如何將BVC官撼、DVC 的公共方法run 抽取出來?


      image.png
  • 2.3 基于OOP想到的一些解決方案?

  1. 將run方法放到另一個對象A中,然后BVC似谁、DVC擁有對象A屬性
    多了一些額外的依賴關(guān)系

  2. 將run方法增加到UIViewController分類中:
    UIViewController會越來越臃腫傲绣,而且會影響它的其他所有子類

  3. 將run方法抽取到新的父類,采用多繼承?(C++支持多繼承):
    會增加程序設(shè)計復(fù)雜度巩踏,產(chǎn)生菱形繼承等問題秃诵,需要開發(fā)者額外解決


    image.png
  • 2.4 POP的解決方案
protocol Runnable {
    func run()
}
extension Runnable {
    func run() {
        print("run")
    }
}
//class BVC: UIViewController, Runnable {}
//class DVC: UITableViewController, Runnable {}
  • 2.5 POP的注意點

    • 優(yōu)先考慮創(chuàng)建協(xié)議,而不是父類(基類)
    • 優(yōu)先考慮值類型(struct塞琼、enum)菠净,而不是引用類型(class)
    • 巧用協(xié)議的擴展功能
    • 不要為了面向協(xié)議而使用協(xié)議
  • 3.利用協(xié)議實現(xiàn)前綴效果

struct MJ<Base> {
    let base: Base
    init(_ base: Base) {
        self.base = base
    }
}
protocol MJCompatible {}
extension MJCompatible {
    static var mj: MJ<Self>.Type {
        get {
            MJ<Self>.self
        }
        set {}
    }
    var mj: MJ<Self> {
        get { MJ(self) }
        set {}
    }
}
extension String: MJCompatible {}
extension MJ where Base == String {
    func numberCount() -> Int { var count = 0
        for c in base where ("0"..."9").contains(c) { count += 1
        }
        return count
    }
}
var string = "123fdsf434"
print(string.mj.numberCount())

4. Base: 類

class Person {}
class Student: Person {}
extension Person: MJCompatible {}
extension MJ where Base: Person {
func run() {}
    static func test() {}
}
Person.mj.test()
Student.mj.test()
let p = Person()
p.mj.run()
let s = Student()
s.mj.run()
4.1 Base: 協(xié)議
extension NSString: MJCompatible {}
extension MJ where Base: ExpressibleByStringLiteral {
func numberCount() -> Int {
    let string = base as! String
    var count = 0
    for c in string where ("0"..."9").contains(c) {
        count += 1
    }
        return count
    }
}
var s1: String = "123fdsf434"
var s2: NSString = "123fdsf434"
var s3: NSMutableString = "123fdsf434"
print(s1.mj.numberCount())
print(s2.mj.numberCount())
print(s3.mj.numberCount())
4.2 利用協(xié)議實現(xiàn)類型判斷
func isArray(_ value: Any) -> Bool { value is [Any] }
isArray( [1, 2] )
isArray( ["1", 2] )
isArray( NSArray() )
isArray( NSMutableArray() )

protocol ArrayType {}
extension Array: ArrayType {}
extension NSArray: ArrayType {}
func isArrayType(_ type: Any.Type) -> Bool { type is ArrayType.Type }

isArrayType([Int].self)
isArrayType([Any].self)
isArrayType(NSArray.self)
isArrayType(NSMutableArray.self)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市彪杉,隨后出現(xiàn)的幾起案子嗤练,更是在濱河造成了極大的恐慌,老刑警劉巖在讶,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煞抬,死亡現(xiàn)場離奇詭異,居然都是意外死亡构哺,警方通過查閱死者的電腦和手機革答,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曙强,“玉大人残拐,你說我怎么就攤上這事〉欤” “怎么了溪食?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娜扇。 經(jīng)常有香客問我错沃,道長,這世上最難降的妖魔是什么雀瓢? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任枢析,我火速辦了婚禮,結(jié)果婚禮上刃麸,老公的妹妹穿的比我還像新娘醒叁。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布把沼。 她就那樣靜靜地躺著啊易,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饮睬。 梳的紋絲不亂的頭發(fā)上租谈,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音续捂,去河邊找鬼。 笑死宦搬,一個胖子當(dāng)著我的面吹牛牙瓢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播间校,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼矾克,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了憔足?” 一聲冷哼從身側(cè)響起胁附,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滓彰,沒想到半個月后控妻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡揭绑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年弓候,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片他匪。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡菇存,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邦蜜,到底是詐尸還是另有隱情依鸥,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布悼沈,位于F島的核電站贱迟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏絮供。R本人自食惡果不足惜关筒,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杯缺。 院中可真熱鬧蒸播,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至包雀,卻和暖如春宿崭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背才写。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工葡兑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赞草。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓讹堤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厨疙。 傳聞我的和親對象是個殘疾皇子洲守,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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