Skip to content

Instantly share code, notes, and snippets.

@sidepelican
Created July 14, 2020 07:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sidepelican/6ec16b523679dce39baa929e559ee834 to your computer and use it in GitHub Desktop.
Save sidepelican/6ec16b523679dce39baa929e559ee834 to your computer and use it in GitHub Desktop.
class A {
class var className: String { "A" }
init() {}
func setup() {
name = {
return Self.className
}
}
var name: (() -> String)?
}
class B: A {
class override var className: String { "B" }
}
class TestWeak {
weak var object: A?
init(_ object: A) {
self.object = object
object.setup()
}
func main() {
print(object?.name!())
}
}
class TestStrong {
var object: A?
init(_ object: A) {
self.object = object
object.setup()
}
func main() {
print(object?.name!())
}
}
TestWeak(A()).main() // nil
TestWeak(B()).main() // nil
TestStrong(A()).main() // Optional("A")
TestStrong(B()).main() // Optional("B")
@sidepelican
Copy link
Author

Self.className はselfのクラスを元に分岐するので循環参照が起こるのかと思ったけど、そうでもない

もちろん、

        name = {
            _  = self
            return Self.className
        }

みたいなことを書いてselfをキャプチャすると循環参照する。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment