<div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif">I think the problem is that you should not call callback?() in didSet() as the values in the closure are updated depending on the function, which means, it is not updated until the didSet() function finished.</div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default"><div><div><br></div><div>Zhaoxin </div></div><div style="font-family:georgia,serif"><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 15, 2016 at 6:17 AM, Diego Sánchez <span dir="ltr">&lt;<a href="mailto:diego.sanchezr@gmail.com" target="_blank">diego.sanchezr@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I don&#39;t know... when didSet is called the struct is already mutated so I would expect all the references to be updated as well.<div><br></div><div>Regarding the capture in the closure it should always capture a reference to &quot;myClass&quot;, and call the accessors in the moment the closure is executed. Adding</div><div>







<p><span>myClass</span><span>.</span><span>myString</span><span>.</span><span>value</span><span> = </span><span>&quot;3&quot;</span></p><p><span>will print &quot;2&quot;.</span></p><p><span>because </span>myClass.myString still holds the previous struct.</p><p>I will solve this problem by making Observable a reference type, but I was wondering if someone could share more details about this behaviour.</p>Cheers,<br>Diego.<br><p><span><br></span></p><p><br></p></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2016-07-14 5:19 GMT+02:00 Zhao Xin <span dir="ltr">&lt;<a href="mailto:owenzx@gmail.com" target="_blank">owenzx@gmail.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default"><div class="gmail_default"><font face="georgia, serif">I think the order is right.</font></div><div class="gmail_default"><font face="georgia, serif"><br></font></div><div class="gmail_default"><font face="georgia, serif">value.set &gt;&gt; value.didSet &gt;&gt; string.set &gt;&gt; string.didSet</font></div><div class="gmail_default"><font face="georgia, serif"><br></font></div><div class="gmail_default"><font face="georgia, serif">you expected </font><span style="font-family:georgia,serif">value.set &gt;&gt; string.set &gt;&gt; </span><span style="font-family:georgia,serif"> </span><span style="font-family:georgia,serif">value.didSet &gt;&gt;</span><span style="font-family:georgia,serif"> </span><span style="font-family:georgia,serif">string.didSet is not correct.</span></div><div class="gmail_default"><font face="georgia, serif"><br></font></div><div class="gmail_default"><font face="georgia, serif">The value &quot;1&quot; is not you expected. However, that is something that I think is tricky. For closure</font></div><div class="gmail_default"><font face="georgia, serif"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"> {<br>    print(myClass.myString.value)<br>}</blockquote><div>it captured the value. However, unless Objective-C, Swift will decide if it is a static capture or an inout capture. So it should be consider right to  be &quot;1&quot; or &quot;2&quot;? I am not sure about that.</div><div><br></div><div>Zhaoxin</div></font></div></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Thu, Jul 14, 2016 at 8:36 AM, Diego Sánchez <span dir="ltr">&lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt;</span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr">Hi all,<div><br></div><div>The following snippet summarises an issue I was investigating:</div><div><br></div><div><div>struct Observable&lt;T&gt; {</div><div>    var value: T {</div><div>        didSet {</div><div>            print(&quot;Observable.didSet&quot;)</div><div>            callback?()</div><div>        }</div><div>    }</div><div>    var callback: (() -&gt; Void)?</div><div>}</div><div><br></div><div>class MyClass {</div><div>    var myString: Observable&lt;String&gt; {</div><div>        get {</div><div>            return _myString</div><div>        }</div><div>        set {</div><div>            print(&quot;MyClass.Setter&quot;)</div><div>            self._myString = newValue</div><div>        }</div><div>    }</div><div><br></div><div>    private var _myString: Observable&lt;String&gt;</div><div>    init (string: Observable&lt;String&gt;) {</div><div>        self._myString = string</div><div>        print(&quot;MyClass.init.end&quot;)</div><div>    }</div><div>}</div><div><br></div><div>let myClass = MyClass(string: Observable&lt;String&gt;(value: &quot;1&quot;, callback: nil))</div><div>myClass.myString.callback = {</div><div>    print(myClass.myString.value)</div><div>}</div><div>myClass.myString.value = &quot;2&quot;</div></div><div><br></div><div><b>Output:</b></div><div><div>MyClass.init.end</div><div>MyClass.Setter</div><div>Observable.didSet</div><div><b>1</b></div><div>MyClass.Setter</div></div><div><br></div><div>Obviously I wasn&#39;t expecting to get &quot;1&quot;, but &quot;2&quot; in the callback&#39;s print, and this happens because MyClass.setter is called after Observable.didSet completes.</div><div><br></div><div>Is it feasible that all the <b>set</b>s are called first, and then all the <b>didSet</b>s?</div><div><br></div><div>Cheers,</div><div>Diego</div></div>
<br></div></div>_______________________________________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>