美文网首页
给SDAutolayout添加一个Swifty风格的点语法Ext

给SDAutolayout添加一个Swifty风格的点语法Ext

作者: 范范饭特稀 | 来源:发表于2019-04-25 15:49 被阅读0次

前言

SDAutoLayout是一个优秀的第三方自动布局库,之前提交了一个pr为其增加一个Swift extension。闲来无事更新了一下并重新提交了pr,希望能够被采纳。

存在的问题

之前的swift拓展使用方法如下:

yourView.layout()
        .topTo(view, 10)
        .leftTo(view, 10)
        .width(is: 100)
        .height(is: 100)

可以看到,方法名layout()容易重名,且方法调用不够swifty,也很难体现出使用的是SDAutolayout。

改进

1.声明一个swift类SDAutoLayout
public final class SDAutoLayout<Base> {
    public let base: Base
    public init(_ base: Base) {
        self.base = base
    }
}
2.声明一个协议SDAutoLayoutCompatible,为其添加一个只读的关联类型sd
public protocol SDAutoLayoutCompatible {
    associatedtype CompatibleType
    var sd: CompatibleType { get }
}
3.实现协议扩展,返回一个SDAutoLayout对象
public extension SDAutoLayoutCompatible {
    var sd: SDAutoLayout<Self> {
        get { return SDAutoLayout(self) }
    }
}
4.为UIView添加一个扩展,并遵守SDAutoLayoutCompatible协议
extension UIView: SDAutoLayoutCompatible { }

凡是遵守这个协议SDAutoLayoutCompatible的类,便拥有了.sd这个属性

5.在SDAutoLayout扩展中添加相应的方法
extension SDAutoLayout where Base: UIView {
    @discardableResult
    public func layout() -> SDAutoLayoutModel {
        return base.sd_layout();
    }
}

UIView通过遵守SDAutoLayoutCompatible协议,为其添加了sd属性,sd本质就是SDAutoLayout对象,这样UIView可以通过点出sd这个属性来调用SDAutoLayout的实例方法。

改进后的使用示例

// example:  swifty 🎉🎉🎉
yourView.sd.layout()
           .topTo(view, 10)
           .leftTo(view, 10)
           .width(is: 100)
           .height(is: 100)

结尾

Swift 真香。

相关文章

网友评论

      本文标题:给SDAutolayout添加一个Swifty风格的点语法Ext

      本文链接:https://www.haomeiwen.com/subject/qxezgqtx.html