Skip to content

Instantly share code, notes, and snippets.

@Igor-Palaguta
Last active January 7, 2019 09:57
Show Gist options
  • Save Igor-Palaguta/8e18f278fac937b2f5062bfff4de4762 to your computer and use it in GitHub Desktop.
Save Igor-Palaguta/8e18f278fac937b2f5062bfff4de4762 to your computer and use it in GitHub Desktop.
var first: First!
let third = Third(first: first)
let second = Second(third: third)
first = First(second: second)
print(first.second.third.first == first)
class First: NSObject {
let second: Second
init(second: Second) {
self.second = second
}
}
class Second {
let third: Third
init(third: Third) {
self.third = third
}
}
class Third {
var first: First? {
return weakFirst.value
}
private let weakFirst: DeferredWeakVar<First>
init(first availableLater: @escaping @autoclosure () -> First?) {
self.weakFirst = DeferredWeakVar(availableLater)
}
}
final class DeferredWeakVar<T: AnyObject> {
var value: T? {
if let value = _value {
return value
} else if let initializer = initializer {
let value = initializer()
_value = value
self.initializer = nil
return value
} else {
return nil
}
}
private var initializer: (() -> T?)?
private(set) weak var _value: T?
init(_ initializer: @escaping () -> T?) {
// force initialize in other case we can have strong reference inside initializer forever if we did not call it
DispatchQueue.main.async {
_ = self.value
}
self.initializer = initializer
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment