This workaround looks better, but it is still workaround. I can trust myself this month and month after that. But I will look at this code after a while (or someone else will look at it) and will not remember/know that there has to be some initializations. I am building tools that handle some common cases of synchronization and etc. These tools must be robust and beautiful so I can advice anyone to use them. None will adopt these tools if they introduce some new points of failure.
> On Nov 4, 2016, at 1:35 PM, Brent Royal-Gordon <br...@architechies.com> wrote: > > (Crossposted to swift-users; swift-dev is for development of the Swift > compiler and standard library, not discussions about how to use Swift.) > >> On Nov 4, 2016, at 2:57 AM, Anton Mironov via swift-dev >> <swift-...@swift.org> wrote: >> >> // This is workaround #1 >> // It looks bad for 2 reasons: implicitly unwrapped optional, it is easy to >> forget to initialize object >> class ContextB : Context { >> var object: ObjectInContext! >> >> init() { >> self.object = ObjectInContext(context: self) >> } >> } > > Try this: > > class ContextB: Context { > private var _object: ObjectInContext? > var object: ObjectInContext { return _object! } > > init() { > _object = nil > // Note that self is now fully initialized > _object = ObjectInContext(context: self) > } > } > > As long as you can trust yourself not to forget to initialize `_object` > within `init()` or mutate `_object` within private scope, this is about as > safe as anything you could hope for. > > -- > Brent Royal-Gordon > Architechies > _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users