<div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif">It seems like a bug. You should file it.</div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default" style="font-family:georgia,serif">Zhaoxin</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Sep 4, 2016 at 11:11 PM,  <span dir="ltr">&lt;<a href="mailto:adelzhang@qq.com" target="_blank">adelzhang@qq.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><u></u>


<div><div>Thanks for reply.

</div><div><br></div><div>How does Swift choose *rules* as you said? 

</div><div><br></div><div>Swfit encourage to override the property observer. But when we change the own property in Child class&#39;s `didSet` observer, 
that would cause infinite loop:

    </div><span class=""><div><br></div><div>    class Base { 
        </div><div>        var a: Int = 0 
    </div><div>    } 

    </div><div><br></div></span><span class=""><div>    class Child : Base { 
        </div><div>        override var a: Int { 
            </div><div>            didSet { 
                </div></span><span class=""><div>                 a = a + 1 
            </div><div>            } 
        </div><div>        } 
    </div><div>     }</div><div>    </div></span><div>     let child = Child() 
    </div><div>     child.a = 3

 
</div><div><br></div><div>Any differcen with situation 1? </div><div><div class="h5"><div><br></div><div><br></div><div>在 Sun, 04 Sep 2016 20:12:42 +0800,Zhao Xin &lt;<a href="mailto:owenzx@gmail.com" target="_blank">owenzx@gmail.com</a>&gt; 写道:<br></div><br><blockquote style="margin:0 0 0.80ex;border-left:#0000ff 2px solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif"><span style="font-family:arial,sans-serif;font-size:13px"><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">1) when `didSet` observer will call?</blockquote><div><br></div></span><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">​For me, it is more like Swift developer tries to override some beginner&#39;s flaw. </blockquote><div><br></div><div>Above is incorrect. You can change property&#39;s value in `didSet`, that won&#39;t cause didSet called again as it is intended to give you the opportunity to do that. </div><div><br></div><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"><span style="font-family:arial,sans-serif;font-size:13px">​</span><span style="font-family:arial,sans-serif;font-size:13px">2) infinite loop</span></blockquote><div><br></div><div>This can&#39;t apply the above rule as they set each other, causing the infinite loops. </div><div><br></div><div>Zhaoxin</div></div></div></blockquote><div><br><div class="gmail_quote">On Sun, Sep 4, 2016 at 7:41 PM, Zhao Xin <span dir="ltr">&lt;<a href="mailto:owenzx@gmail.com" target="_blank">owenzx@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"><span><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"><span style="font-family:arial,sans-serif;font-size:13px">1) when `didSet` observer will call?</span></blockquote><div><br></div></span><div class="gmail_default" style="font-family:georgia,serif">​For me, it is more like Swift developer tries to override some beginner&#39;s flaw. </div><div class="gmail_default" style="font-family:georgia,serif"><br></div><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">​<span style="font-size:13px;font-family:arial,sans-serif">2) infinite loop</span></blockquote><br style="font-size:13px"><div><div class="gmail_default" style="font-family:georgia,serif">​If you intended to do things bad, things ​went bad.</div><div class="gmail_default" style="font-family:georgia,serif"><br></div><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"><span style="font-family:arial,sans-serif;font-size:13px">3) override property observer</span></blockquote><div> </div><div><div class="gmail_default" style="font-family:georgia,serif">​You mentioned &quot;TSPL(The Swift Programming Language) ​&quot;, and it says in it:</div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default"><div class="gmail_default" style="font-family:georgia,serif">“NOTE</div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default" style="font-family:georgia,serif">The willSet and didSet observers of superclass properties are called when a property is set in a subclass initializer, after the superclass initializer has been called. They are not called while a class is setting its own properties, before the superclass initializer has been called.</div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default" style="font-family:georgia,serif">For more information about initializer delegation, see Initializer Delegation for Value Types and Initializer Delegation for Class Types.”</div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default" style="font-family:georgia,serif">From: Apple Inc. “The Swift Programming Language (Swift 3 Beta)”。 iBooks. <a href="https://itun.es/us/k5SW7.l" target="_blank">https://itun.es/us/k5SW7.l</a></div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default" style="font-family:georgia,serif">You didn&#39;t provide a `init()`, but since you properties were already set. There was a hidden `init()` when you called `Child()`.</div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default" style="font-family:georgia,serif">Last, </div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default"><span><div class="gmail_default"><font face="georgia, serif"> let base = child as Base</font></div><div class="gmail_default"><font face="georgia, serif"> base.a  = 4 // still output &quot;base didset&quot; and &quot;child didset&quot;</font></div><div class="gmail_default"><font face="georgia, serif"><br></font></div></span><div class="gmail_default"><font face="georgia, serif">In Swift, as or as! won&#39;t change the instance&#39;s dynamic type. So it does nothing. `type(of:base)` is still `</font><span style="font-size:13px">Child`.</span></div></div><div class="gmail_default" style="font-family:georgia,serif"><br></div><div class="gmail_default" style="font-family:georgia,serif">Zhaoxin</div></div><br></div><br></div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Sep 4, 2016 at 6:25 PM, adelzhang via swift-users <span dir="ltr">&lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all<br>
<br>
It sounds convenient to monitor change in property&#39;s value using property observer.<br>
But TSPL(The Swift Programming Language) talk little about property observer. There<br>
are some questions abouts property observer.<br>
<br>
1) when `didSet` observer will call?<br>
<br>
I assume it&#39;s fine that changing property&#39;s value in `didSet` observer.<br>
<br>
    class Foo {<br>
        var a: Int = 0 {<br>
            didSet {<br>
                print(&quot;didset&quot;)<br>
                a = a + 1<br>
            }<br>
        }<br>
    }<br>
<br>
    let foo = Foo()<br>
    foo.a = 4  // only output &quot;didset&quot; once<br>
<br>
Why it don&#39;t cause infinite loop?<br>
<br>
2) infinite loop<br>
<br>
    // this code snippet cause inifinite loop<br>
    class Foo {<br>
        var a: Int = 0 {<br>
            didSet {<br>
                b = a + 1<br>
            }<br>
        }<br>
<br>
        var b: Int = 1 {<br>
            didSet {<br>
                a = b - 1<br>
            }<br>
        }<br>
    }<br>
<br>
    let foo = Foo()<br>
    foo.a = 2<br>
<br>
3) override property observer<br>
<br>
    class Base {<br>
        var a: Int = 0 {<br>
            didSet {<br>
                print(&quot;base didset&quot;)<br>
            }<br>
        }<br>
    }<br>
<br>
    class Child : Base {<br>
        override var a : Int {<br>
            didSet {<br>
                print(&quot;child didset&quot;)<br>
            }<br>
        }<br>
    }<br>
<br>
    let child = Child()<br>
    child.a = 2 // output &quot;base didset&quot; and &quot;child didset&quot;<br>
    let base = child as Base<br>
    base.a  = 4 // still output &quot;base didset&quot; and &quot;child didset&quot;<br>
<br>
Why overriding property observer still call parent&#39;s `didSet` observer?<br>
<br>
--<br>
Adel<br>
<br>
<br>
______________________________<wbr>_________________<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/<wbr>mailman/listinfo/swift-users</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div><blockquote style="margin:0 0 0.80ex;border-left:#0000ff 2px solid;padding-left:1ex">
</blockquote><br></div></div></div></blockquote></div><br></div>