欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swift使用SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化

 更新時(shí)間:2022年09月14日 15:01:18   作者:剪刀石頭布啊  
這篇文章主要為大家介紹了Swift?SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

我們平時(shí)用swift寫(xiě)第三方擴(kuò)展(OC中的分類(lèi))時(shí),可能會(huì)直接就往擴(kuò)展里面寫(xiě)方法,簡(jiǎn)單又方便,然而當(dāng)我們看一些常用你的三方(例如:Kingfisher、SnapKit)等,都會(huì)用一個(gè)簡(jiǎn)單的參數(shù)引出(例如:kf、snp),下面來(lái)探索一下怎么用的,然后在總結(jié)其優(yōu)缺點(diǎn)

SnapKit擴(kuò)展方式簡(jiǎn)要思考

SnapKit為例,使用如下,發(fā)現(xiàn)引入了 snp

var iv = UIImageView();
iv.snp.makeConstraints { make in
}

中間變量 snp 如下所示,ConstraintView是統(tǒng)一不同平臺(tái)的重命名(別名)

public extension ConstraintView {
    var snp: ConstraintViewDSL {
        return ConstraintViewDSL(view: self)
    }
}

其以前版本也是直接將 left 等加上前綴 snp_,直接調(diào)用,而加入前綴我想大家一眼就看出來(lái)目的了,沒(méi)錯(cuò)避免與其他擴(kuò)展重名,現(xiàn)在也已經(jīng)改成了引入snp的方式,來(lái)間接調(diào)用,實(shí)際邏輯都通過(guò) snp 來(lái)調(diào)用,個(gè)人猜測(cè)也是借鑒了主流的應(yīng)用來(lái)更新的,調(diào)用時(shí),至少分類(lèi) API 整潔了

優(yōu)缺點(diǎn):

  • 1、引入中間變量 snp 之后,首先感覺(jué)到的就是,我們的分類(lèi)在調(diào)用的時(shí)候,明顯沒(méi)有那么多雜亂的方法了(這種方式OC其實(shí)也可以借鑒)
  • 2、另外也可以取消了前綴,減少了代碼量,并且當(dāng)與其他類(lèi)出現(xiàn)重名的時(shí)候,只需要替換 snp 的變量名字即可,不需要替換全部方法,減少了命名阻礙
  • 3、不同三方之間通過(guò)引入該參數(shù),讓我們的調(diào)用模塊標(biāo)識(shí)更明顯,功能模塊也更清晰,可維護(hù)性更強(qiáng)

Kingfisher擴(kuò)展方式簡(jiǎn)要思考

Kingfisher為例,使用如下,發(fā)現(xiàn)引入了 kf

var iv = UIImageView();
iv.kf.setImage(with: URL(string: "http://www.baidu.com"))

另外其在使用過(guò)程中,通過(guò)充分利用 swift 特性,比 SnapKit 使用上更優(yōu)雅高效一些

//聲明一個(gè)基礎(chǔ)協(xié)議,必須為 AnyObject 類(lèi)型,可用于后續(xù)給基礎(chǔ)類(lèi)添加協(xié)議
public protocol KingfisherCompatible: AnyObject { }
//擴(kuò)展實(shí)現(xiàn)該基礎(chǔ)協(xié)議,以便于方便讓我們的組件能夠直接通過(guò) .kf 直接調(diào)用里面的方法
//此 kf 和 snap 類(lèi)似,只不過(guò)添加了一個(gè)泛型,用于不同類(lèi)之間進(jìn)行擴(kuò)展限制
extension KingfisherCompatible {
    public var kf: KingfisherWrapper<Self> {
        get { return KingfisherWrapper(self) }
        set { }
    }
}
//通過(guò)泛型頂一個(gè)一個(gè)基礎(chǔ)類(lèi),通過(guò)該基礎(chǔ)類(lèi)可以獲取我們被擴(kuò)展的組件
//且通過(guò)該基礎(chǔ)類(lèi)的泛型,可以分別給不同類(lèi)型添加不同擴(kuò)展方法
public struct KingfisherWrapper<Base> {
    public let base: Base
    public init(_ base: Base) {
        self.base = base
    }
}
//當(dāng)遵循協(xié)議的類(lèi)為 UIImage 的時(shí)候,為其擴(kuò)展方法
extension KingfisherWrapper where Base: KFCrossPlatformImage {
    ...
}
//當(dāng)遵循協(xié)議的類(lèi)為 KFCrossPlatformImageView 的時(shí)候,為其擴(kuò)展方法
extension KingfisherWrapper where Base: KFCrossPlatformImageView {
    ...
}
...
//上面僅僅是定義了一個(gè)擴(kuò)展后可以使用的協(xié)議,并未應(yīng)用到我們的基礎(chǔ)組件中
//因此只需要給基礎(chǔ)組件添加擴(kuò)展,遵循我們的協(xié)議即可
extension KFCrossPlatformImageView: KingfisherCompatible { }

沒(méi)見(jiàn)到名字的View 是為了不同平臺(tái)統(tǒng)一名字起的別名,如下所示(打消疑慮專(zhuān)用)

#if os(iOS) || os(tvOS)
    public typealias ConstraintView = UIView
#else
    public typealias ConstraintView = NSView
#endif

優(yōu)缺點(diǎn):

  • 1、引入中間變量 kf 之后,首先感覺(jué)到的就是,我們的分類(lèi)在調(diào)用的時(shí)候,明顯沒(méi)有那么多雜亂的方法了(這種方式OC其實(shí)也可以借鑒)
  • 2、另外也可以取消了前綴,減少了代碼量,并且當(dāng)與其他類(lèi)出現(xiàn)重名的時(shí)候,只需要替換 kf 的變量名字即可,不需要替換全部方法,減少了命名阻礙
  • 3、不同三方之間通過(guò)引入該參數(shù),讓我們的調(diào)用模塊標(biāo)識(shí)更明顯,功能模塊也更清晰,可維護(hù)性更強(qiáng)
  • 4、引入?yún)f(xié)議和泛型,通過(guò)協(xié)議統(tǒng)一引入同一個(gè)中間變量,通過(guò)泛型給不同的分類(lèi)擴(kuò)展出不同的方法,減少無(wú)效方法和代碼等,結(jié)構(gòu)更清晰,某種角度上,其為進(jìn)階版的擴(kuò)展方式

自行模仿嘗試

public protocol MarshalTest: AnyObject {}
struct Wrapper<T>  {
    public let base: T
    init(_ base: T) {
        self.base = base
    }
}
extension MarshalTest {
    var ml: Wrapper<Self> {
        get { Wrapper(self) }
        set { }
    }
}
extension UIImageView : MarshalTest {}
extension Wrapper where T: UIImageView {
    func setImg() {
    }
}
extension Wrapper where T: UIView {
    func setBkg() {
    }
}
class ViewController: UIViewController {
    override func viewDidLoad() {
        var iv2 = UIImageView()
        iv2.ml.setImg()  
    }
}

這就測(cè)試成功了,我們模仿時(shí),就可以參考這個(gè)寫(xiě)

最后

當(dāng)我們自己為默認(rèn)組件擴(kuò)展內(nèi)容時(shí),如果只擴(kuò)展一個(gè)類(lèi)和功能,可以像 snp 一樣,直接引入中間變量擴(kuò)展即可,如果我們的擴(kuò)展了多個(gè)分類(lèi),而隸屬于一個(gè)模塊,那么可以模仿 Kingfisher,讓我們的功能更清晰

以上就是Swift SnapKit模仿Kingfisher第三方擴(kuò)展優(yōu)化示例的詳細(xì)內(nèi)容,更多關(guān)于SnapKit第三方擴(kuò)展的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SwiftUI中@ViewBuilder的相關(guān)知識(shí)點(diǎn)解密

    SwiftUI中@ViewBuilder的相關(guān)知識(shí)點(diǎn)解密

    IOS開(kāi)發(fā)目前最主流的框架當(dāng)屬SwiftUI了,這篇文章主要給大家介紹了關(guān)于SwiftUI中@ViewBuilder的一些相關(guān)知識(shí)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法

    Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法

    本篇文章主要介紹了Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Swift?reduce函數(shù)使用示例詳解

    Swift?reduce函數(shù)使用示例詳解

    這篇文章主要為大家介紹了Swift?reduce函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 使用?Swift?Package?插件生成代碼的示例詳解

    使用?Swift?Package?插件生成代碼的示例詳解

    這篇文章主要介紹了使用?Swift?Package?插件生成代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • SwiftUI智能家居開(kāi)關(guān)燈頁(yè)面搭建示例

    SwiftUI智能家居開(kāi)關(guān)燈頁(yè)面搭建示例

    這篇文章主要為大家介紹了SwiftUI智能家居開(kāi)關(guān)燈頁(yè)面搭建示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Swift進(jìn)階教程Mirror反射示例詳解

    Swift進(jìn)階教程Mirror反射示例詳解

    這篇文章主要為大家介紹了Swift進(jìn)階教程Mirror反射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果實(shí)例代碼

    Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Swift利用純代碼實(shí)現(xiàn)時(shí)鐘效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • swift中獲取字符串前綴的七種方法總結(jié)

    swift中獲取字符串前綴的七種方法總結(jié)

    在日常的開(kāi)發(fā)中,經(jīng)常會(huì)需要獲取一個(gè)字符串的前綴,在這篇文章中我總結(jié)了在 Swift 中檢查字符串前綴的多種方法分享給大家,看看有沒(méi)有你不知道的
    2023-12-12
  • Swift教程之基礎(chǔ)數(shù)據(jù)類(lèi)型詳解

    Swift教程之基礎(chǔ)數(shù)據(jù)類(lèi)型詳解

    這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類(lèi)型詳解,本文詳細(xì)講解了Swift中的基本數(shù)據(jù)類(lèi)型和基本語(yǔ)法,例如常量和變量、注釋、分號(hào)、整數(shù)、數(shù)值類(lèi)型轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • swift 可選型的使用詳解

    swift 可選型的使用詳解

    可選性是Swift提供的一個(gè)特殊類(lèi)型,它為我們編寫(xiě)程序提供便利的條件。這篇文章主要介紹了swift 可選型的使用詳解,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10

最新評(píng)論