[10] 名稱空間擴充套件和鏈式呼叫

weixin_34148340發表於2017-11-01

思想來自流行的第三方庫,如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"
}

相關文章