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

Reply via email to