前言
SDAutoLayout是一個(gè)優(yōu)秀的第三方自動(dòng)布局庫,之前提交了一個(gè)pr為其增加一個(gè)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.聲明一個(gè)swift類SDAutoLayout。
public final class SDAutoLayout<Base> {
public let base: Base
public init(_ base: Base) {
self.base = base
}
}
2.聲明一個(gè)協(xié)議SDAutoLayoutCompatible,為其添加一個(gè)只讀的關(guān)聯(lián)類型sd。
public protocol SDAutoLayoutCompatible {
associatedtype CompatibleType
var sd: CompatibleType { get }
}
3.實(shí)現(xiàn)協(xié)議擴(kuò)展,返回一個(gè)SDAutoLayout對(duì)象
public extension SDAutoLayoutCompatible {
var sd: SDAutoLayout<Self> {
get { return SDAutoLayout(self) }
}
}
4.為UIView添加一個(gè)擴(kuò)展,并遵守SDAutoLayoutCompatible協(xié)議
extension UIView: SDAutoLayoutCompatible { }
凡是遵守這個(gè)協(xié)議SDAutoLayoutCompatible的類,便擁有了.sd這個(gè)屬性
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對(duì)象,這樣UIView可以通過點(diǎn)出sd這個(gè)屬性來調(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 真香。