Kingfisher 源碼分析(一):命名空間 kf 實現(xiàn)

namespacing kf 實現(xiàn)

引用文件:

  • Kingfisher.swift
  • ImageView+Kingfisher.swift
  • UIButton+Kingfisher.swift

實現(xiàn):

//Kingfisher.swift
public final class Kingfisher<Base> {
    public let base: Base
    public init(_ base: Base) {
        self.base = base
    }
}

/**
 A type that has Kingfisher extensions.
 */
public protocol KingfisherCompatible {
    associatedtype CompatibleType
    var kf: CompatibleType { get }
}

public extension KingfisherCompatible {
    public var kf: Kingfisher<Self> {
        get { return Kingfisher(self) }
    }
}

extension Image: KingfisherCompatible { }
#if !os(watchOS)
extension ImageView: KingfisherCompatible { }
extension Button: KingfisherCompatible { }

//ImageView+Kingfisher.swift
extension Kingfisher where Base: ImageView {
@discardableResult
    public func setImage(with resource: Resource?,
                         placeholder: Image? = nil,
                         options: KingfisherOptionsInfo? = nil,
                         progressBlock: DownloadProgressBlock? = nil,
                         completionHandler: CompletionHandler? = nil) -> RetrieveImageTask
    {
        ...
    }
}

//UIButton+Kingfisher.swift
extension Kingfisher where Base: UIButton {
    @discardableResult
    public func setImage(with resource: Resource?,
                         for state: UIControlState,
                         placeholder: UIImage? = nil,
                         options: KingfisherOptionsInfo? = nil,
                         progressBlock: DownloadProgressBlock? = nil,
                         completionHandler: CompletionHandler? = nil) -> RetrieveImageTask
    {
        ...
    }
}

調(diào)用事例:

let imageView = UIImageView()
imageView.kf.setImage(...)

let button = UIButton()
button.kf.setImage(...)

分析

Kingfisher<Base> 是一個范型類,類型是 Base 。

public protocol KingfisherCompatible {
    associatedtype CompatibleType
    var kf: CompatibleType { get }
}
public extension KingfisherCompatible {
    public var kf: Kingfisher<Self> {
        get { return Kingfisher(self) }
    }
}

extension ImageView: KingfisherCompatible { }
extension Button: KingfisherCompatible { }

定義協(xié)議 KingfisherCompatible窝稿,聲明屬性 kf,類型是范型 CompatibleType 寄疏。并要求遵守協(xié)議的一方,實現(xiàn)該屬性的 get 方法僵井。

在協(xié)議擴展中陕截,協(xié)議自身實現(xiàn)了屬性。這樣就不必在每個遵守該協(xié)議的類里實現(xiàn)該屬性了批什。參見蘋果文檔

Protocols can be extended to provide method and property implementations to conforming types. This allows you to define behavior on protocols themselves, rather than in each type’s individual conformance or in a global function.

協(xié)議里的 kf 是一個 Kingfisher 類的實例农曲,調(diào)用的方法是 Kingfisher 類的方法。根據(jù)類型的不同,調(diào)用不同類型里的方法乳规。如:對應(yīng) UIImageView / UIButton 的 Kingfisher 里的setImage 方法形葬。

綜上,也就實現(xiàn)了命名空間 kf 暮的。

如圖:

命名空間 kf

我們詳細說說 KingfisherCompatible 笙以。

public var kf: Kingfisher<Self> : Self 用在協(xié)議里面,代表的是遵守協(xié)議的 對象(類/結(jié)構(gòu)體/枚舉) 類型冻辩。如:extension ImageView: KingfisherCompatible { }猖腕,用在這里,Self 是 ImageView 恨闪; extension Button: KingfisherCompatible { }倘感,用在這里, Self 是 Button 咙咽。

如果我們不用 public extension KingfisherCompatible 老玛,也可以在遵守協(xié)議的時候,單獨實現(xiàn) kf 屬性犁珠。

如單獨實現(xiàn) UIImageView 的協(xié)議擴展逻炊,像這樣:

extension UIImageView: KingfisherCompatible {
    public var kf: Kingfisher<UIImageView> { return Kingfisher(self) }
}

extension Kingfisher where Base: UIImageView  {
    public func setImage() { print("imageView setImage") }
}

最后互亮,樣例如下:

public final class Kingfisher<Base> {
    public let base: Base
    public init(_ base: Base){
        self.base = base
    }
}
public protocol KingfisherCompatible {
    associatedtype CompatibleType
    var kf: CompatibleType { get }
}
extension UIImageView: KingfisherCompatible {
    public var kf: Kingfisher<UIImageView> { return Kingfisher(self) }
}
extension Kingfisher where Base: UIImageView  {
    public func setImage() { print("imageView setImage") }
}
extension UIButton: KingfisherCompatible {
    public var kf: Kingfisher<UIButton> { return Kingfisher(self) }
}
extension Kingfisher where Base: UIButton {
    public func setImage() { print("button setImage") }
}

let imageView = UIImageView()
imageView.kf.setImage()
let button = UIButton()
button.kf.setImage()

//輸出
imageView setImage
button setImage
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犁享,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子豹休,更是在濱河造成了極大的恐慌炊昆,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件威根,死亡現(xiàn)場離奇詭異凤巨,居然都是意外死亡,警方通過查閱死者的電腦和手機洛搀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門敢茁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人留美,你說我怎么就攤上這事彰檬。” “怎么了谎砾?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵逢倍,是天一觀的道長。 經(jīng)常有香客問我景图,道長较雕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任挚币,我火速辦了婚禮亮蒋,結(jié)果婚禮上扣典,老公的妹妹穿的比我還像新娘。我一直安慰自己慎玖,他們只是感情好激捏,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凄吏,像睡著了一般远舅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痕钢,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天图柏,我揣著相機與錄音,去河邊找鬼任连。 笑死蚤吹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的随抠。 我是一名探鬼主播裁着,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拱她!你這毒婦竟也來了二驰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤秉沼,失蹤者是張志新(化名)和其女友劉穎桶雀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唬复,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡矗积,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了敞咧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棘捣。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖休建,靈堂內(nèi)的尸體忽然破棺而出乍恐,到底是詐尸還是另有隱情,我是刑警寧澤丰包,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布禁熏,位于F島的核電站,受9級特大地震影響邑彪,放射性物質(zhì)發(fā)生泄漏瞧毙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宙彪。 院中可真熱鬧矩动,春花似錦、人聲如沸释漆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽男图。三九已至示姿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逊笆,已是汗流浹背栈戳。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留难裆,地道東北人子檀。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像乃戈,于是被迫代替她去往敵國和親褂痰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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

  • 序言 Kingfisher是喵神的一個異步下載和緩存圖片的Swift庫症虑,類似于OC 的SDWebImage中文簡介...
    喬克_叔叔閱讀 6,091評論 7 25
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫缩歪、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評論 4 62
  • 晚風送來涼意細雨朦朧了橘黃色的燈光城市燈光慵懶的沉醉里笑容在每個人的臉上枯萎風聲侦讨、雨聲驶冒、鳴笛聲不斷被心靈的沉寂彈回...
    流水亦公子閱讀 308評論 4 5
  • 舊友來探我在異鄉(xiāng)清酌 如今煙不抽苟翻,沒得借火 當年初學畫 談理想論美 囫圇宛若老虎吃豬 如今說 什么是美 好看的姑娘...
    鹿羊I閱讀 186評論 0 2
  • 第四卷 革命時期的愛情 第一到三章 我爬爐筒時韵卤,大概是九歲到十一二歲。到了四十歲上崇猫,我發(fā)現(xiàn)后來我干任何事情都沒有了...
    吳玉純閱讀 321評論 0 0