Skip to content

Instantly share code, notes, and snippets.

@marty-suzuki
Created July 10, 2019 03:39
Show Gist options
  • Save marty-suzuki/075052e8c62f274830a7deb4bc8b6842 to your computer and use it in GitHub Desktop.
Save marty-suzuki/075052e8c62f274830a7deb4bc8b6842 to your computer and use it in GitHub Desktop.
struct Weak<T: AnyObject> {
private let o: () -> T?
init(_ o: T) {
self.o = { [weak o] in o }
}
}
extension Weak {
func `do`<U>(execute: (T) -> U?) -> U? {
guard let o = o() else {
return nil
}
return execute(o)
}
}
protocol Trait {}
enum Leak: Trait {}
enum NoLeak: Trait {}
final class Sample<T: Trait> {
private var handler: (() -> String?)?
deinit {
print("deinit Called when Trait is \(T.self)")
}
private func string(from value: Int) -> String {
return String(value)
}
}
extension Sample where T == Leak {
convenience init(_: Void) {
self.init()
self.handler = { self.string(from: 0) }
}
}
extension Sample where T == NoLeak {
convenience init(_: Void) {
self.init()
let weakSelf = Weak(self)
self.handler = {
weakSelf.do { $0.string(from: 0) }
}
}
}
var leak: Sample<Leak>? = .init(())
leak = nil
var noLeak: Sample<NoLeak>? = .init(())
noLeak = nil
// deinit Called when Trait is NoLeak
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment