Created
July 10, 2019 03:39
-
-
Save marty-suzuki/075052e8c62f274830a7deb4bc8b6842 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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