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

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

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

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

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



import UIKit

extension UIView: Wrapperable { }

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

// 使用
let label = UILabel().rx.adhere(toSuperView: UIView()).config { (label) in
   label.text = "Hello World"
}

你可能感兴趣的:([10] 命名空间扩展和链式调用)