Ward
ward
是一个 Swift 微框架,帮助清除难看的内存管理语法。
之前
func useAClosureBasedAPI(block: @escaping (Something) -> Void) { ... }
useAClosureBasedAPI(block: { [weak self] something in
guard let strongSelf = self else {
return
}
strongSelf.handle(something)
})
之后
useAClosureBasedAPI(block: ward(self) { strongSelf, something in
strongSelf.handle(something)
})
幕后
public func ward<Object: AnyObject>(_ object: Object, f: @escaping (Object) -> Void) -> () -> Void {
return { [weak object] in
guard let object = object else { return }
f(object)
}
}
其他用法
支持 Swift 的 未应用的方法引用
使用 Curried function API 调用 Swift 自动合成的静态访问器实例方法
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
useAClosureBasedAPI(block: ward(self, MyViewController.handleSomething))
// MyViewController.handleSomething is of type (MyViewController) -> (Something) -> Void
}
func handleSomething(_ something: Something) {
...
}
}
支持返回非 Void
的闭包
/// Returns half of `count` while `self` is alive. If `self` has deallocated, returns the provided default value (nil).
let halfOfCountIfSelfAlive: (_ count: Int) -> Int? = ward(self, else: nil) { _, count in
return count / 2
}
支持为多个对象使用 ward
let anObject = MyClass()
ward(self, anObject) { strongSelf, theObject in
...
}
试试看!
Carthage
github 'OneAfternoon/Ward' ~> 1.0
CocoaPods
pod 'Ward', '~> 1.0'
Swift 包管理器
.package(url: "https://github.com/OneAfternoon/Ward.git", from: "1.0.0")