How is retroactive modeling accommodated in this scheme? Say I want to conform three types I don&#39;t own to a protocol of my design and supply a default implementation for a protocol requirement. How would I go about it?<br><div class="gmail_quote"><div dir="ltr">On Thu, Apr 28, 2016 at 11:53 Erica Sadun via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Draft. Criticism and suggestions both welcome. -- E</div><div><br></div><div><h1 style="font-size:2.25em;margin-right:0px;margin-bottom:16px;margin-left:0px;line-height:1.2;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255);margin-top:0px!important">Requiring Proactive Overrides for Default Protocol Implementations</h1><ul style="padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)"><li>Proposal: tbd</li><li>Author(s): <a href="http://github.com/erica" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none" target="_blank">Erica Sadun</a></li><li>Status: tbd</li><li>Review manager: tbd</li></ul><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#introduction" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1" target="_blank"><u></u><u></u><u></u><u></u></a>Introduction</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">This proposal enhances protocol implementation safety. It incorporates two keywords that cooperate with compiler checks to limit &quot;near miss&quot; implementation errors and accidental member overrides.</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)"><em>This proposal was discussed on the Swift Evolution list in the <a href="http://thread.gmane.org/gmane.comp.lang.swift.evolution/15496" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none" target="_blank">[Pitch] Requiring proactive overrides for default protocol implementations.</a> thread</em></p><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#motivation" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1" target="_blank"><u></u><u></u><u></u><u></u></a>Motivation</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">The proposal introduces a mandatory <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">required</code> keyword that marks members as fulfiling protocol requirements. This expansion reduces the risk of near-miss implementations (for example, adding <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">thud(x: Double)</code> when <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">thud(x: Float)</code>is required), provides in-line documentation of why the member has been included, thereby enhancing the code-level documentation at the implementation point, and supports compile-time checks for protocol conformance.</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">This proposal extends the <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code> keyword to protocol conformance. The Swift Programming Language describes the way subclass methods must override implementations established in superclasses. <em>Methods on a subclass that override the superclass’s implementation are marked with *</em><code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code>*<em>—overriding a method by accident, without override, is detected by the compiler as an error. The compiler also detects methods with override that don’t actually override any method in the superclass.</em></p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">Adding an <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code> requirement expands this cautious approach to protocols. Developers must override implementations inherited from protocol extensions with the <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code> keyword. And the compiler will flag uses of <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code> where member implementations do not, in fact, override an existing implementation. The keyword prevents accidental overrides, where a sensible member name conflicts with signatures established in the protocol conformance and forces users to proactively select a version in favor of existing protocol extensions.</p><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#detail-design" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1" target="_blank"><u></u><u></u><u></u><u></u></a>Detail Design</h2><ul style="padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)"><li>The <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code> keyword is extended to protocol inheritance, and when used prefers the overridden behavior to the default behavior. </li><li>Swift will prefer an overridden implementation in preference in reverse hierarchical order: type extensions take precedence over type declarations over protocol extensions over protocol declarations (assuming protocol declarations eventually adopt default implementations).</li><li>The <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">required</code> keyword marks a member as satisfying a protocol requirement, whether in protocol extensions, type declarations, or type extensions.</li></ul><h4 style="margin-top:1em;margin-bottom:16px;line-height:1.4;font-size:1.25em;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#required-protocol-members" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1.2" target="_blank"><u></u><u></u><u></u><u></u></a>Required Protocol Members</h4><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">Protocol requirements are marked with <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">required</code> for compile-time checks of intentional conformance.</p><div style="margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)"><pre style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal;word-break:normal"><span style="color:rgb(167,29,93)">protocol</span> A { 
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">foo</span>() 
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">bar</span>()
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">blort</span>()
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">gar</span>()
}

<span style="color:rgb(167,29,93)">extension</span> A {
    <span style="color:rgb(167,29,93)">required</span> <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">blort</span>() {} <span style="color:rgb(150,152,150)">// Correct, required by `A`</span>
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">womble</span>() {} <span style="color:rgb(150,152,150)">// Correct, new method in extension</span>
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">gar</span>() {} <span style="color:rgb(150,152,150)">// Incorrect: Compiler says: add `required` keyword or remove implementation</span>
}

<span style="color:rgb(167,29,93)">struct</span> B: A {
    <span style="color:rgb(167,29,93)">required</span> <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">foo</span>() {} <span style="color:rgb(150,152,150)">// Correct</span>
    <span style="color:rgb(167,29,93)">required</span> <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">far</span>() {} <span style="color:rgb(150,152,150)">// Near miss. Compiler: rename method or drop required keyword</span>
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">bar</span>() {} <span style="color:rgb(150,152,150)">// Possible accidental name match. Compiler: rename method or add required keyword</span>
}</pre></div><h4 style="margin-top:1em;margin-bottom:16px;line-height:1.4;font-size:1.25em;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#member-overrides" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1.2" target="_blank"><u></u><u></u><u></u><u></u></a>Member Overrides</h4><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">Overrides are marked with <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code> to ensure intent.</p><div style="margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)"><pre style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal;word-break:normal"><span style="color:rgb(167,29,93)">protocol</span> A { 
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">foo</span>() 
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">bar</span>()
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">blort</span>()
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">gar</span>()
}

<span style="color:rgb(167,29,93)">extension</span> A {
    <span style="color:rgb(167,29,93)">required</span> <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">foo</span>() {} <span style="color:rgb(150,152,150)">// correct</span>
    <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">womble</span>() {} <span style="color:rgb(150,152,150)">// correct</span>
}

<span style="color:rgb(167,29,93)">struct</span> B: A {
    <span style="color:rgb(167,29,93)">required</span> <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">bar</span>() {} <span style="color:rgb(150,152,150)">// correct</span>
    <span style="color:rgb(167,29,93)">required</span> <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">foo</span>() {} <span style="color:rgb(150,152,150)">// incorrect: Compiler says: add `override` keyword or remove implementation</span>
     <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">womble</span>() {} <span style="color:rgb(150,152,150)">// incorrect: Compiler says add `override` keyword or remove implementation. `required` is not needed as `womble` is not a required protocol member.</span>
}</pre></div><h4 style="margin-top:1em;margin-bottom:16px;line-height:1.4;font-size:1.25em;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#handling-changes" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1.2" target="_blank"><u></u><u></u><u></u><u></u></a>Handling Changes</h4><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">Default implementations can be added or removed at any time, as can type conformance implementations:</p><table style="border-spacing:0px;border-collapse:collapse;margin-top:0px;margin-bottom:16px;display:block;width:888px;overflow:auto;word-break:keep-all;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)"><tbody><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">**Original**</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">**Change**</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">**Outcome**</td></tr><tr width="800" style="background-color:rgb(248,248,248);border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Some member implemented in type</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Protocol adds that member</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Must add `required` to type implementation or rename member to avoid conflict</td></tr><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Some member implemented in type, marked as `required`</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Protocol removes that member or it never existed</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Must remove `required` from type implementation</td></tr><tr width="800" style="background-color:rgb(248,248,248);border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Some member implemented in type, marked as `override`</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Protocol extension removes that member or it never existed</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Must remove `override` from type implementation</td></tr><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Some member implemented in typed, member not mentioned in protocol</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Extension adds default version of member</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Type implementation must add `override` keyword</td></tr><tr width="800" style="background-color:rgb(248,248,248);border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">`required` member implemented in type</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Default member added</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Must add `override` or remove type implementation</td></tr><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">`override required` member implemented in type</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Remove default member</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Must remove `override` in type implementation</td></tr><tr width="800" style="background-color:rgb(248,248,248);border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">`override required` member implemented in type</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Remove type member implementation</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Default implementation now used</td></tr><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Type member uses `required` keyword</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Protocol removes requirement or never had it</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Type implementation must remove `required` keyword</td></tr><tr width="800" style="background-color:rgb(248,248,248);border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Protocol declares required member</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Extension implements default implementation</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Extension must add `required` keyword, differentiating default implementations from added behavior</td></tr><tr width="800" style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204)"><td width="250" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Swift adds default implementations to protocols as well as extensions</td><td width="150" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Protocol adds default implementation</td><td width="400" style="padding:6px 13px;border:1px solid rgb(221,221,221)">Type implementation must use both `required` and `override` keywords. Protocol extension must use `override` keyword. Order of preference goes: overriden member, overriden extension, protocol default implementation</td></tr></tbody></table><h4 style="margin-top:1em;margin-bottom:16px;line-height:1.4;font-size:1.25em;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#multiple-conformance-conflict" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1.2" target="_blank"><u></u><u></u><u></u><u></u></a>Multiple Conformance Conflict</h4><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">Consider the following situation. For the sake of future-proofing, this example includes default protocol implementations although they do not yet exist in Swift.</p><div style="margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)"><pre style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal;word-break:normal"><span style="color:rgb(167,29,93)">protocol</span> A { <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">foo</span>() {<span style="color:rgb(167,29,93)">...</span><span style="color:rgb(167,29,93)">default</span><span style="color:rgb(167,29,93)">...</span>} }
<span style="color:rgb(167,29,93)">protocol</span> B { <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">foo</span>() {<span style="color:rgb(167,29,93)">...</span><span style="color:rgb(167,29,93)">default</span><span style="color:rgb(167,29,93)">...</span>} }
<span style="color:rgb(167,29,93)">extension</span> A { <span style="color:rgb(167,29,93)">override</span> <span style="color:rgb(167,29,93)">required</span> <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">foo</span>() {<span style="color:rgb(167,29,93)">...</span>A <span style="color:rgb(167,29,93)">extension</span><span style="color:rgb(167,29,93)">...</span>} }
<span style="color:rgb(167,29,93)">Type</span> CType: A, B {}</pre></div><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">In this example, the compiler emits a warning that &quot;CType cannot unambiguously differentiate which version of <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">foo</code> to use for <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">CType</code> instances&quot;. If the CType type were to be removed or either of its conformances erased, there would be no compiler issues.</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">To fix this scenario, CType must implement a version of foo that resolves the conflict:</p><div style="margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)"><pre style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;margin-top:0px;margin-bottom:0px;line-height:1.45;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal;word-break:normal"><span style="color:rgb(167,29,93)">Type</span> CType: A, B { <span style="color:rgb(167,29,93)">override</span> <span style="color:rgb(167,29,93)">required</span> <span style="color:rgb(167,29,93)">func</span> <span style="color:rgb(121,93,163)">foo</span>() { 
    <span style="color:rgb(150,152,150)">// either</span>
    A<span style="color:rgb(167,29,93)">.</span>foo(<span style="color:rgb(167,29,93)">self</span>)() <span style="color:rgb(150,152,150)">// uses the A extension default implementation</span>
    <span style="color:rgb(150,152,150)">// or</span>
    B<span style="color:rgb(167,29,93)">.</span>foo(<span style="color:rgb(167,29,93)">self</span>)() <span style="color:rgb(150,152,150)">// uses the B protocol default implementation</span>
    <span style="color:rgb(150,152,150)">// or both, one after the other, etc.</span>
}</pre></div><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">In this rewrite, <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">foo</code> is unambiguously referenced for <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">CType</code> instance members.</p><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#impact-on-existing-code" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1" target="_blank"><u></u><u></u><u></u><u></u></a>Impact on Existing Code</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">These changes introduce mandates that do not exist in today&#39;s Swift code and will require migration. The migrator (and compiler) must detect both scenarios: that a member satisfies a protocol requirement and needs the <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">required</code> keyword, and that a member overrides a default implementation (in current Swift, only in extensions) and needs the <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code>keyword.</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">In the degenerate case that protocol extensions provide two distinct default implementations of the same member (whether required or not), the <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code> version should always be preferred. When multiple <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">override</code> versions exist, the compiler should emit a warning about ambiguous resolution.</p><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">Using type currying, e.g. <code style="font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:14px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">A.foo(self)</code> should always resolve using the rules enumerated earlier in this proposal, moving from type extensions to types to protocol extension to protocols.</p><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#alternatives-considered" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1" target="_blank"><u></u><u></u><u></u><u></u></a>Alternatives Considered</h2><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255)">Not at this time.</p><h2 style="margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;background-color:rgb(255,255,255)"><a href="https://gist.github.com/erica/fc66e6f6335750d737e5512797e8284a#acknowledgements-and-thanks" style="background-color:transparent;color:rgb(64,120,192);text-decoration:none;display:inline-block;padding-right:2px;line-height:1" target="_blank"><u></u><u></u><u></u><u></u></a>Acknowledgements and Thanks</h2><div style="margin-top:0px;color:rgb(51,51,51);font-family:&#39;Helvetica Neue&#39;,Helvetica,&#39;Segoe UI&#39;,Arial,freesans,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:16px;background-color:rgb(255,255,255);margin-bottom:0px!important">Thanks, Doug Gregor, Jordan Rose, and Joe Groff</div></div></div><div style="word-wrap:break-word"><div><br></div><div><br></div><div><br></div><br><div><blockquote type="cite"><div>On Apr 27, 2016, at 6:07 PM, Douglas Gregor &lt;<a href="mailto:dgregor@apple.com" target="_blank">dgregor@apple.com</a>&gt; wrote:</div></blockquote></div><br></div>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div>