前言
SDAutoLayout是一個優(yōu)秀的第三方自動布局庫,之前提交了一個pr為其增加一個Swift extension狠角。閑來無事更新了一下并重新提交了pr绒瘦,希望能夠被采納。
存在的問題
之前的swift拓展使用方法如下:
yourView.layout()
.topTo(view, 10)
.leftTo(view, 10)
.width(is: 100)
.height(is: 100)
可以看到朴爬,方法名layout()
容易重名即寒,且方法調(diào)用不夠swifty,也很難體現(xiàn)出使用的是SDAutolayout召噩。
改進(jìn)
1.聲明一個swift類SDAutoLayout
母赵。
public final class SDAutoLayout<Base> {
public let base: Base
public init(_ base: Base) {
self.base = base
}
}
2.聲明一個協(xié)議SDAutoLayoutCompatible
,為其添加一個只讀的關(guān)聯(lián)類型sd
具滴。
public protocol SDAutoLayoutCompatible {
associatedtype CompatibleType
var sd: CompatibleType { get }
}
3.實(shí)現(xiàn)協(xié)議擴(kuò)展,返回一個SDAutoLayout
對象
public extension SDAutoLayoutCompatible {
var sd: SDAutoLayout<Self> {
get { return SDAutoLayout(self) }
}
}
4.為UIView添加一個擴(kuò)展凹嘲,并遵守SDAutoLayoutCompatible
協(xié)議
extension UIView: SDAutoLayoutCompatible { }
凡是遵守這個協(xié)議SDAutoLayoutCompatible的類,便擁有了.sd
這個屬性
5.在SDAutoLayout擴(kuò)展中添加相應(yīng)的方法
extension SDAutoLayout where Base: UIView {
@discardableResult
public func layout() -> SDAutoLayoutModel {
return base.sd_layout();
}
}
UIView
通過遵守SDAutoLayoutCompatible
協(xié)議,為其添加了sd
屬性抵蚊,sd
本質(zhì)就是SDAutoLayout
對象施绎,這樣UIView
可以通過點(diǎn)出sd
這個屬性來調(diào)用SDAutoLayout
的實(shí)例方法。
改進(jìn)后的使用示例
// example: swifty ??????
yourView.sd.layout()
.topTo(view, 10)
.leftTo(view, 10)
.width(is: 100)
.height(is: 100)
結(jié)尾
Swift 真香贞绳。