A Swift micro-framework to clean up memory management syntax.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Configs
Sources
Tests
Ward.xcodeproj
.gitignore
.travis.yml
LICENSE
Package.swift
README.md
Ward.podspec

README.md

Ward

Travis CI code cov release Swift 4.1 license

CocoaPods compatible Carthage compatible SwiftPM compatible platforms

ward is a Swift micro-framework to help with cleaning up ugly memory management syntax.

Before

func useAClosureBasedAPI(block: @escaping (Something) -> Void) { ... }

useAClosureBasedAPI(block: { [weak self] something in
    guard let strongSelf = self else {
        return
    }

    strongSelf.handle(something)
})

After

useAClosureBasedAPI(block: ward(self) { strongSelf, something in
    strongSelf.handle(something)
})

Under the hood

public func ward<Object: AnyObject>(_ object: Object, f: @escaping (Object) -> Void) -> () -> Void {
    return { [weak object] in
        guard let object = object else { return }
        f(object)
    }
}

Other use cases

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
   ...
}

Try it out!

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")

Authors