Maybe there are several initialisers, with different ways of calculating 'y' depending on what you give it.
Karl > > On Jun 15, 2016 at 2:26 PM, <Charlie Monroe > (mailto:char...@charliemonroe.net)> wrote: > > > > Is there a particular reason for not using lazy var here? > > class MySuperClass { > init() {} > } > > class MyClass : MySuperClass { > > let x: Int > lazy var y: String = self.someInstanceMethod() > > init(x: Int) { > self.x = x > super.init() > } > > func someInstanceMethod() -> String { > return "Kaboom" > } > } > > > > > On Jun 15, 2016, at 2:22 PM, Karl via swift-evolution > > <swift-evolution@swift.org (mailto:swift-evolution@swift.org)> wrote: > > > > Say you have the following code. There is a property on MyClass (‘y’) > > which is derived from other data via an instance method; Two-stage > > initialisation. > > > > class MySuperClass { > > init() {} > > } > > > > class MyClass : MySuperClass { > > > > let x : Int > > var y : String > > > > init(x: Int) { > > > > self.x = x > > super.init() > > y = someInstanceMethod() > > } > > } > > > > The code won’t compile because you call super.init before initialising all > > properties. The way to work-around this so far is to make the type of ‘y’ > > an implicitly-unwrapped optional. I don’t think it’s very elegant to have > > to change the type of ‘y’ in this case - it exposes implementation details > > and implies that the value may sometimes be nil, which is not the case. > > > > What about if we allowed you to explicitly declare that it’s okay for ‘y’ > > not to be initialised before calling super.init? Perhaps by assigning it to > > the underscore: > > > > self.x = x > > y = _ > > super.init() > > y = someInstanceMethod() > > > > 'y' would still effectively work as an implicitly-unwrapped optional - the > > value would be initialised to nil, and any attempt to use it before it is > > initialised would be a fatal runtime error as with an IUO. This also means > > that it couldn’t be a “let” value. > > > > This change wouldn’t give you any additional safety when using two-stage > > initialisation; it would simply not require you to change the type of the > > property when doing so. > > > > Thoughts? > > > > Karl > > _______________________________________________ > > swift-evolution mailing list > > swift-evolution@swift.org (mailto:swift-evolution@swift.org) > > https://lists.swift.org/mailman/listinfo/swift-evolution > >
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution