Search code examples
swiftthrowlazy-initialization

swift lazy var with throw init behavior


I am not sure if it is a bug or it is really how things should work?

class A {
    init() throws { }
}

class B {
    lazy var instance = A()
}

this code compiles without mistakes using XCode 9 and latest Swift version, and works perfect unless Class A init() really throws, then lazy var is null pointer. But shouldn't be this code somehow not be compiled?


Solution

  • This is indeed a bug (SR-7862) – you cannot throw errors out of a property initialiser context (and even if you could, you would be required to prefix the call with try), therefore the compiler should produce an error.

    I have opened a pull request to fix this (#17022).

    Edit: The patch has now been cherry-picked to the 4.2 branch, so it'll be fixed for the release of Swift 4.2 with Xcode 10 (and until the release you can try a 4.2 snapshot).