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