<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 13, 2016, at 3:15 AM, Brent Royal-Gordon &lt;<a href="mailto:brent@architechies.com" class="">brent@architechies.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Let's start with this:<br class=""><br class=""><blockquote type="cite" class=""><blockquote type="cite" class="">, and the compiler will need to make sure partial method calls are ordered such that everything needed is already initialized; it's simply a question of whether we declare what's needed or automatically detect it. I've noticed in previous proposals that scanning the method body is disfavored, so I figure that's not our best bet here.<br class=""></blockquote><br class="">This is another reason I am not sure about this. &nbsp;I think you are right that this would require a declaration. &nbsp;It becomes much more verbose that way.<br class=""></blockquote><br class="">The compiler will absolutely, 100%, inescapably need to know which properties a given partial method initializes. Otherwise it can't properly perform its phase one check, and if this proposal breaks safe initialization, it's not going to be accepted.<br class=""><br class="">We could specify that the compiler takes a peek at the implementation and figures out which fields it initializes, or we could specify that the method declares the fields it will initialize. But however we choose to do it, doing it in *some* way is not negotiable.<br class=""></div></div></blockquote><div><br class=""></div><div>Yes of course it needs to know about what properties are initialized. &nbsp;It does not need to know about which properties have been initialized prior to calling the partial initializer though if we don’t allow it to read pre-initialized properties.</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><br class=""><blockquote type="cite" class=""><blockquote type="cite" class="">I think that many, possibly most, partial methods—especially those that are meant to be called as normal methods will need to access existing properties<br class=""></blockquote><br class="">Do you have some concrete examples? &nbsp;I’m sure this would be useful in some cases, I’m just not sure whether we need to include it right away. &nbsp;<br class=""></blockquote><br class="">Sure. Let's extend your resetting example so that the value you can reset the property *to* is configurable:<br class=""><br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>struct Resettable&lt;Value&gt; {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>private let initialValue: Value<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>var value: Value<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>partial(uses initialValue, inits value) mutating func reset() {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>value = initialValue<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>}<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>init(_ initialValue: Value) {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>self.initialValue = initialValue<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>reset()<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>}<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}<br class=""><br class=""></div></div></blockquote><div><br class=""></div><div>This is a reasonable example. &nbsp;John, if you’re still following this thread does allowing reads from properties that must be initialized <b class="">prior to </b>calling a partial init seem worthwhile to include? &nbsp;Or does it seem like something that would make the proposal more likely to be rejected? &nbsp;</div><div><br class=""></div><div>Also, given the comments regarding the memberwise init proposal, is a partial initializer proposal reasonable to continue pursuing right now? &nbsp;Or is this something that should wait?</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><blockquote type="cite" class="">If the memberwise init review is anything to go by, there will be a lot of pushback that something like this makes the proposal too complex. &nbsp;People might warm to it more after using the basic feature for a while and realizing the limitation this poses in practice.<br class=""></blockquote><br class="">You don't want to make things overly complicated, but you also don't want to ignore obvious needs. In hindsight, SE-0019 made both of those mistakes in different places.<br class=""></div></div></blockquote><div><br class=""></div><div>I think you mean&nbsp;SE-0018. &nbsp;I learned a couple of things during that process. &nbsp;</div><div><br class=""></div><div>One is that it is really hard to tell how to strike an appropriate balance if you want to do something nontrivial. &nbsp;It seems like there is a lot of pressure to keep proposals very minimal (I tried very hard to get a solution to `let` defaults into the proposal for example). &nbsp;This means necessarily choosing which needs to address because addressing all “obvious" needs makes the proposal too large and likely too complex. &nbsp;Additionally, which needs are “obvious” is in the eye of the beholder.</div><div><br class=""></div><div>Another thing is that it’s easy to start with the wrong premise. &nbsp;In this case, the idea was to enhance the existing memberwise init feature, keeping changes as small as possible to increase chances of the proposal being accepted. &nbsp;That just wasn’t the right place to start to address boilerplate in explicit / nontrivial initializers. &nbsp;I realized the “automatic” model was likely too complex and the “opt-in” model was probably better just before the review began but it was too late to change the proposal. &nbsp;And I didn’t give enough consideration to trying to find a more general way to solve the problem (such as partial initializers) until well into the review discussion.</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><br class=""><blockquote type="cite" class="">One thing I would be concerned about is that the compiler will enforce proper order during initialization, but it will not enforce anything later. &nbsp;If you are resetting state you will be on your own to do things in the correct order. &nbsp;If the partial inits are not able to read from a property they didn’t write that at least helps prevent mistakes during the reset sequence (of course at the cost of some flexibility in structuring your code).<br class=""></blockquote><br class="">I'm not really sure why this is a concern. After `init` finishes, none of the fields you access could be uninitialized. There's nothing built in to Swift that lets you ensure methods are only called when the instance is in a state that expects them; all you've got for that is precondition(). I just don't see how this is any worse than what we've already got.<br class=""></div></div></blockquote><div><br class=""></div><div>Well it <b class="">would have to</b>&nbsp;ensure that sequencing during initialization for a partial initializer that reads from a property it does not set. &nbsp;My point wasn’t that something would be uninitialized later, but rather that your code might rely on “re-initialization” to happen in a certain sequence to be correct. &nbsp;It might lead to mistakes when the compiler enforces sequencing during initialization but not later.</div><div><br class=""></div><div>Of course you are right that you can “re-initialize” vars already today without any ordering guarantee so it wouldn’t make new mistakes possible. &nbsp;On balance it probably would make things better by allowing you to factor out code.</div><div><br class=""></div><div>I’m not opposed to allowing this. &nbsp;I just wouldn't want to include it only to find out later that it is a sticking point that leads to rejection of the proposal.</div><div><br class=""></div><div>Matthew</div></div></body></html>