給SDAutolayout添加一個(gè)Swifty風(fēng)格的點(diǎn)語法Extension

前言

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 真香。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容