<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">[resending without quoting the proposal, because apparently that made Mail emit garbage today]<br class=""><br class=""><br class="">Hi, Erica. Sorry for not participating in the first round here. I’m…not so happy with this direction, for a number of reasons. (I apologize for&nbsp;the laundry list, but they’re not really related complaints.)<br class=""><br class="">- ‘required’ already means something today: it means “this initializer must be present on all subclasses”. The reason it only applies to&nbsp;initializers is because all other members are&nbsp;always&nbsp;present on all subclasses.<br class=""><br class="">(Counter-argument: using ‘required’ on an initializer could be seen as making an implicit protocol, just for that class hierarchy.)<br class=""><br class="">- ‘override’ likewise already has a meaning; allowing ‘override’ to be satisfied by a protocol requirement means that it might&nbsp;miss&nbsp;an override&nbsp;intended for a superclass—or inadvertently become one when an SDK is updated.<br class=""><br class="">(Counter-argument: that last can happen to protocols already.)<br class=""><br class="">- This doesn’t cover cases where methods in&nbsp;one&nbsp;protocol extension satisfy requirements in another.<br class=""><br class="">- This doesn’t cover retroactive modeling.<br class=""><br class="">- I’m not sure what it means to "prefer an overridden implementation in preference in reverse hierarchical order: type extensions take&nbsp;precedence over type declarations over protocol extensions over protocol declarations (assuming protocol declarations eventually adopt&nbsp;default implementations)”. Protocol conformance is decided at compile time; there won’t ever&nbsp;be&nbsp;any members in type extensions that take&nbsp;precedent over a type declaration without causing a conflict. (That is, currently you are not allowed to define such a member.)<br class=""><br class="">- A member in the type does&nbsp;<i class="">not</i>&nbsp;“override" a member in a protocol extension today, because such a call is not dynamically dispatched.&nbsp;Making protocol extension members dynamically dispatched is challenging at the least and would require an implementation plan in the&nbsp;proposal.<br class=""><br class="">- Thank you for writing up all of the source compatibility cases! I&nbsp;<i class="">think</i>&nbsp;there’s no issue with binary compatibility, since IIUC the proposal&nbsp;doesn’t change how anything is implemented, and we think we know how to handle binary compatibility there. But I’d like to think about it a&nbsp;little more.<br class=""><br class="">- The “A.foo(self)()” syntax is clever, but it doesn’t work correctly for mutating methods (because you can’t curry an inout). On the other&nbsp;hand, JoeG already brought up the idea of making ‘self’ the first argument of the implicit static member. It still doesn’t solve the problem of&nbsp;<i class="">picking</i>&nbsp;a protocol extension, but that’s not new. (This isn’t a complaint, I guess, just a note.)<br class=""><br class=""><br class="">I’m not sure I have a meaningful summary or conclusion, but I’d be hesitant to do all of this without these concerns being addressed.<br class=""><br class="">Jordan</body></html>