美文网首页
给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