<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I'm just one person out of many on this list that you can convince. However, it's gonna be an uphill battle to get my vote. I see the small clarity benefit that this brings but I also see big problems that you didn't mention.</div><div class=""><br class=""></div><div class="">First, property observers are currently not fired from initializers. This is because it is unreasonably constraining that observers should be able to run even though your object has not been fully initialized. What if they need another variable that has not been initialized? It is not possible to create a migration tool that would automatically fix these issues, as you can have multiple initializers that initialize members in a different order. Is it worth it to potentially break every existing Swift code base to be able to move initialization code a few lines up?</div><div class=""><br class=""></div><div class="">This also does not address the case where let properties are initialized in a different order in different initializers. You could easily end up with observers that simply cannot run at the time that they should.</div><div class=""><br class=""></div><div class="">Second, let properties cannot have observers attached to it for reasons that are obvious in the current model (observers don't fire in init methods and let properties cannot be modified outside the init method). Your proposal would add them for the sole purpose of using them in the init method, since they cannot fire from anywhere else. There is also a very interesting proposal to&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151214/003148.html" class="">generalize property behaviors</a>, which may structurally transform how willSet and didSet are implemented, and this proposal currently excludes behaviors on let properties.</div><div class=""><br class=""></div><div class="">It's not necessarily a bad idea to move the code elsewhere, but I don't think that this is an appropriate solution.</div><br class=""><div class="">
<span class="Apple-style-span" style="border-collapse: separate; line-height: normal; border-spacing: 0px;">Félix</span>
</div>
<br class=""><div><blockquote type="cite" class=""><div class="">Le 23 déc. 2015 à 12:39:10, shengjia wang &lt;<a href="mailto:wangshengjia01@gmail.com" class="">wangshengjia01@gmail.com</a>&gt; a écrit :</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="">Hi,</div><div class=""><br class=""></div><div class="">You are saying: <i class="">"Because you can probably just put most of that code at the end of your&nbsp;initialiser"</i>. I see.. and this proposal is exactly about how to avoid this situation.</div><div class=""><br class=""></div>I'm saying it would be neat if we can band some side effects once we set a `let` property. Example:<div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="color:rgb(187,44,162)" class="">&nbsp; &nbsp; let</span> view: <span style="color:rgb(112,61,170)" class="">UIView</span> {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:rgb(187,44,162)" class="">didSet</span> {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; view.background = <span style="color:rgb(112,61,170)" class="">UIColor</span>.blackColor()</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(112, 61, 170);" class=""><span style="" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color:rgb(79,129,135)" class="">view</span><span style="" class="">.</span>translatesAutoresizingMaskIntoConstraints</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; <span style="color:rgb(187,44,162)" class="">let</span> scrollView: <span style="color:rgb(112,61,170)" class="">UIScrollView</span> {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:rgb(187,44,162)" class="">willSet</span> {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scrollView.removeObserver(<span style="color:rgb(187,44,162)" class="">self</span>, forKeyPath: <span style="color:rgb(209,47,27)" class="">"contentOffset"</span>)</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:rgb(187,44,162)" class="">didSet</span> {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scrollView.addObserver(<span style="color:rgb(187,44,162)" class="">self</span>, forKeyPath: <span style="color:rgb(209,47,27)" class="">"contentOffset"</span>, options: .New, context: <span style="color:rgb(187,44,162)" class="">nil</span>)</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="color:rgb(187,44,162)" class="">&nbsp; &nbsp; init</span>(targetScrollView: <span style="color:rgb(112,61,170)" class="">UIScrollView</span>) {</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:rgb(79,129,135)" class="">view</span> = <span style="color:rgb(112,61,170)" class="">UIView</span>()</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; scrollView = targetScrollView</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:rgb(187,44,162)" class="">super</span>.<span style="color:rgb(187,44,162)" class="">init</span>()</div><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class="">&nbsp; &nbsp; &nbsp; &nbsp; // if we could put them into property observing ...</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp;view.background = <span style="color:rgb(112,61,170)" class="">UIColor</span>.blackColor()</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(112, 61, 170);" class=""><span style="" class="">&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp;</span><span style="color:rgb(79,129,135)" class="">view</span><span style="" class="">.</span>translatesAutoresizingMaskIntoConstraints</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; //&nbsp;scrollView.<span style="color:rgb(61,29,129)" class="">addObserver</span>(<span style="color:rgb(187,44,162)" class="">self</span>, forKeyPath: <span style="color:rgb(209,47,27)" class="">"contentOffset"</span>, options:<font color="#703daa" class="">.New</font>, context: <span style="color:rgb(187,44,162)" class="">nil</span>)</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp; // ...</div><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="">







</p><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class="">&nbsp; &nbsp; }</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">We can extract the "setup property" step from init method and separate them for all different properties just after the property be initialised. Otherwise, we have to either mix them into the init method or change `let` to `var`. Both are doable but not ideal in my opinion.</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family:arial,sans-serif;font-size:small" class=""><br class=""></span></div><div style="margin: 0px; line-height: normal;" class="">By the way, the principal of this idea is&nbsp;similar to <a href="https://twitter.com/jesse_squires/status/626264940450480128" class="">another approach for IBOutlet property</a>&nbsp;:</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></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="color:rgb(41,47,51);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;white-space:pre-wrap;background-color:rgb(245,248,250)" class="">Use </span><strong style="color:rgb(41,47,51);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;white-space:pre-wrap" class="">didSet</strong><span style="color:rgb(41,47,51);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;white-space:pre-wrap;background-color:rgb(245,248,250)" class=""> on your IBOutlets to configure views instead of cramming code into viewDidLoad. Much cleaner. Still called only once.</span></blockquote><div class=""><br class=""></div><div class="">- Victor Wang&nbsp;</div></div><div class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Wed, Dec 23, 2015 at 5:07 PM, Félix Cloutier <span dir="ltr" class="">&lt;<a href="mailto:felixcca@yahoo.ca" target="_blank" class="">felixcca@yahoo.ca</a>&gt;</span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="">willSet and didSet are currently not even called from the init method. This also goes counter to the current property behaviors proposal (didGet and didSet would become part of that) because behaviors aren't planned for let properties.<div class=""><br class=""></div><div class="">You're saying you want it to happen as soon as it was set, but do you really need it "as soon as that" or can you afford to wait a little bit? Because you can probably just put most of that code at the end of your initializer, where it's guaranteed that the property has been set.<br class=""><div class=""><br class=""><div class="">
<span style="border-collapse: separate; font-family: 'Lucida Grande'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;" class="">Félix</span>
</div>

<br class=""><div class=""><blockquote type="cite" class=""><div class=""><div class="h5"><div class="">Le 23 déc. 2015 à 10:22:46, shengjia wang via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt; a écrit :</div><br class=""></div></div><div class=""><div class=""><div class="h5"><div dir="ltr" class=""><div class=""><br class=""></div><div class="">Since swift v1.2, we can initialize `let` property in `init()` instead of being forced to give a value when declare it. This is great !&nbsp;<br class=""></div><div class=""><br class=""></div><div class="">But every time I run into the case such as the example below:</div><div class=""><br class=""></div><div class="">let view: UIView {</div><div class="">&nbsp; didSet {</div><div class="">&nbsp; &nbsp; /**&nbsp;</div><div class="">&nbsp; &nbsp; &nbsp;* This time, `view` did set ( a.k.a initialized in case of `let` property), so I want to bind some other actions just after, such as `setBackgroundColor`. But actually I can't, compiler will complain that `let` declaration can not be observing properties. So I have to either move all these "actions" to `init()` or change `view` to a `var` property which is not necessary at all.</div><div class="">&nbsp; &nbsp; &nbsp;*/</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">Actually in swift, I think it's quite commun issue that people run into a large `init()` method. This approach could make it way better in most cases.</div><div class=""><br class=""></div><div class="">So, I'm wondering why not make `didSet` also available for `let` property, or maybe even better to add new keyword such as "didInit" which only get called for first set.</div><div class=""><br class=""></div><div class="">- Victor Wang</div></div>
</div></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=iRI3beHTe3UxYAHTlV3lA38zIPfHMhyuRzgTmGKV6k4hWgQ7LZ7-2BWMRdXW5ysMCIHZFfUSVobq6HMsNSYzHc3V1qcmcu0ijmD4VuwnWEfIpCxIhMF1QoF1fAQih46hMUIDz96AIlkQgMMx1NEvV3YQAMeORgRPYyzw-2BGQozWLv583tnPyNdfEA5zEj-2FXriCkpWyKLZu6bl4vW2xFbdyf7lu-2BgY5pIYTthLI1cJaFwMY-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important" class="">
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></body></html>