ward
is a Swift micro-framework to help with cleaning up ugly memory management syntax.
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)
}
}
Supports Swift's unapplied method references
Use the curried function API to call Swift's automatically synthesized static accessors for instance methods:
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) {
...
}
}
Supports non-Void
returning closures
/// 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
}
Supports ward
for multiple objects
let anObject = MyClass()
ward(self, anObject) { strongSelf, theObject in
...
}
Carthage
github 'OneAfternoon/Ward' ~> 1.0
CocoaPods
pod 'Ward', '~> 1.0'
Swift Package Manager
.package(url: "https://github.com/OneAfternoon/Ward.git", from: "1.0.0")