[10] 命名空间扩展和链式调用

思想来自流行的第三方库,如RxSwift、Kingfisher、SnapKit等。
代码如下:

// 命名空间扩展
struct Wrapper<Base> {
   let base: Base
   
   init(_ base: Base) {
       self.base = base
   }
}

protocol Wrapperable {
   associatedtype CompatibleType
   
   var rx: Wrapper<CompatibleType> { get }
   
}

extension Wrapperable {
   var rx: Wrapper<Self> {
       return Wrapper(self)
   }
   
}



import UIKit

extension UIView: Wrapperable { }

// 扩展链式调用方法
extension Wrapper where Base: UIView {
   
   func adhere(toSuperView: UIView) -> Wrapper<Base> {
       toSuperView.addSubview(self.base)
       return self
   }
   
   @discardableResult
   public func layout(snapKitMaker: (ConstraintMaker) -> Void) -> Wrapper<Base> {
       self.base.snp.makeConstraints { (make) in
           snapKitMaker(make)
       }
       return self
   }
   
   @discardableResult
   func config(_ config: (Base) -> Void) -> Wrapper<Base> {
       config(self.base)
       return self
   }
}

// 使用
let label = UILabel().rx.adhere(toSuperView: UIView()).config { (label) in
   label.text = "Hello World"
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容