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

前言

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 {
    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 {
        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风格的点语法Extension)