<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們平時用swift
寫第三方擴充套件(OC中的分類)時,可能會直接就往擴充套件裡面寫方法,簡單又方便,然而當我們看一些常用你的三方(例如:Kingfisher、SnapKit
)等,都會用一個簡單的引數引出(例如:kf
、snp
),下面來探索一下怎麼用的,然後在總結其優缺點
以 SnapKit
為例,使用如下,發現引入了 snp
var iv = UIImageView(); iv.snp.makeConstraints { make in }
中間變數 snp
如下所示,ConstraintView
是統一不同平臺的重新命名(別名)
public extension ConstraintView { var snp: ConstraintViewDSL { return ConstraintViewDSL(view: self) } }
其以前版本也是直接將 left
等加上字首 snp_
,直接呼叫,而加入字首我想大家一眼就看出來目的了,沒錯避免與其他擴充套件重名,現在也已經改成了引入snp
的方式,來間接呼叫,實際邏輯都通過 snp
來呼叫,個人猜測也是借鑑了主流的應用來更新的,呼叫時,至少分類 API 整潔了
優缺點:
snp
之後,首先感覺到的就是,我們的分類在呼叫的時候,明顯沒有那麼多雜亂的方法了(這種方式OC其實也可以借鑑)字首
,減少了程式碼量,並且當與其他類出現重名的時候,只需要替換 snp
的變數名字即可,不需要替換全部
方法,減少了命名阻礙以 Kingfisher
為例,使用如下,發現引入了 kf
var iv = UIImageView(); iv.kf.setImage(with: URL(string: "http://www.baidu.com"))
另外其在使用過程中,通過充分利用 swift
特性,比 SnapKit
使用上更優雅高效一些
//宣告一個基礎協定,必須為 AnyObject 型別,可用於後續給基礎類新增協定 public protocol KingfisherCompatible: AnyObject { } //擴充套件實現該基礎協定,以便於方便讓我們的元件能夠直接通過 .kf 直接呼叫裡面的方法 //此 kf 和 snap 類似,只不過新增了一個泛型,用於不同類之間進行擴充套件限制 extension KingfisherCompatible { public var kf: KingfisherWrapper<Self> { get { return KingfisherWrapper(self) } set { } } } //通過泛型頂一個一個基礎類,通過該基礎類可以獲取我們被擴充套件的元件 //且通過該基礎類的泛型,可以分別給不同型別新增不同擴充套件方法 public struct KingfisherWrapper<Base> { public let base: Base public init(_ base: Base) { self.base = base } } //當遵循協定的類為 UIImage 的時候,為其擴充套件方法 extension KingfisherWrapper where Base: KFCrossPlatformImage { ... } //當遵循協定的類為 KFCrossPlatformImageView 的時候,為其擴充套件方法 extension KingfisherWrapper where Base: KFCrossPlatformImageView { ... } ... //上面僅僅是定義了一個擴充套件後可以使用的協定,並未應用到我們的基礎元件中 //因此只需要給基礎元件新增擴充套件,遵循我們的協定即可 extension KFCrossPlatformImageView: KingfisherCompatible { }
沒見到名字的View 是為了不同平臺統一名字起的別名,如下所示(打消疑慮專用)
#if os(iOS) || os(tvOS) public typealias ConstraintView = UIView #else public typealias ConstraintView = NSView #endif
優缺點:
kf
之後,首先感覺到的就是,我們的分類在呼叫的時候,明顯沒有那麼多雜亂的方法了(這種方式OC其實也可以借鑑)kf
的變數名字即可,不需要替換全部方法,減少了命名阻礙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() } }
這就測試成功了,我們模仿時,就可以參考這個寫
當我們自己為預設元件擴充套件內容時,如果只擴充套件一個類和功能,可以像 snp
一樣,直接引入中間變數擴充套件即可,如果我們的擴充套件了多個分類,而隸屬於一個模組,那麼可以模仿 Kingfisher
,讓我們的功能更清晰
以上就是Swift SnapKit模仿Kingfisher第三方擴充套件優化範例的詳細內容,更多關於SnapKit第三方擴充套件的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45