<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}
h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}
h1 {
        color: #000000;
        font-size: 28pt;
}
h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}
h3 {
        font-size: 18px;
}
h4 {
        font-size: 16px;
}
h5 {
        font-size: 14px;
}
h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}
hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
display: inherit;
}
p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}
a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}
#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}
button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}
code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}
code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}
pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}
pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}
#ws { background-color: #f8f8f8; }
.bloop_markdown table {
border-collapse: collapse;
font-family: Helvetica, arial, freesans, clean, sans-serif;
color: rgb(51, 51, 51);
font-size: 15px; line-height: 25px;
padding: 0; }
.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }
.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }
.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }
.bloop_markdown blockquote{
border-left: 4px solid #dddddd;
padding: 0 15px;
color: #777777; }
blockquote > :first-child {
margin-top: 0; }
blockquote > :last-child {
margin-bottom: 0; }
code, pre, #ws, #message {
word-break: normal;
word-wrap: normal;
}
hr {
display: inherit;
}
.bloop_markdown :first-child {
-webkit-margin-before: 0;
}
code, pre, #ws, #message {
font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}
.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><p>There are a few good points made here. It’s an interesting workaround to use <code>type(of:)</code> to get a similar behavior I wanted. My point is, that <code>Current</code> or call it static <code>Self</code> should exist to fill some gaps in our design patterns. Using <code>Self</code> in protocols should not always mean that you shall use the dynamic behavior. Yes on value types the dynamic type is the same conforming type. </p>
<pre><code class="swift">// All these protocol do not compile
// This is not real world example, but IMO should be possible
protocol P : class {
associatedtype StaticSelf : AnyObject
func castOrTrap<T : StaticSelf>() -> T
}
protocol P : class {
associatedtype StaticSelf : Self
func castOrTrap<T : StaticSelf>() -> T
}
protocol P : class {
func castOrTrap<T : Self>() -> T
}
</code></pre>
<p>The absence of static <code>Self</code> does hurt the flexibility of the language to design a specific but yet clear behavior. The <code>P</code> protocol is meant to have a static <code>Self</code>, where conforming to it would result in a shorthand version using <code>StaticSelf/Current</code> or the conforming type:</p>
<pre><code class="swift">class A : P {
func castOrTrap<T : Current>() -> T { … }
// or
func castOrTrap<T : A>() -> T { … }
}
</code></pre>
<p>I cannot think of a possible workaround here except of defining that method on the base type itself. If other not derived classes need to have this pattern, I cannot create an ancestor protocol as I might would like.</p>
<hr>
<p>The forced <code>required init</code> might be a good workaround for the issue from some previous post, but is it really what we always wanted? This restriction lives only on the non-final classes because <code>Self</code> there is dynamic, which feels kinda inconsistent. As I already mentioned, I’d be happy if we could drop the restriction on the conforming type to allow the user to decide if we want to follow the contract of using <code>self</code> (lowercased) and <code>type(of: self)</code> or could simply override <code>Self</code> with <code>ContainingTypeName</code>. That would solve that issue, if I’m not totally missing here something.</p>
<p>But the issue from above remans unsolved. Furthermore, does dynamic <code>Self</code> make any sense on non-final classes as a parameter type? Can anyone show me a plausible code snippet for that?</p>
<hr>
<p>Sure my arguments are more like <strong>might</strong>, <strong>want</strong> etc. and not that much of a weight, but that’s my honest opinion that some restrictions makes the language less flexible as it could be.</p>
<p><code>Self</code> is exactly like <code>.Type</code> which might also be magically <code>.Protocol</code>. The static and dynamic behaviors are baked into one place. :/</p>
<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1483868455556030976" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">-- <br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 8. Januar 2017 um 00:51:32, Xiaodi Wu via swift-evolution (<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div><div></div><div>
<title></title>
<div dir="ltr">On Sat, Jan 7, 2017 at 5:33 PM, Braeden Profile
<span dir="ltr"><<a href="mailto:jhaezhyr12@gmail.com" target="_blank">jhaezhyr12@gmail.com</a>></span> wrote:<br>
<div class="gmail_extra">
<div class="gmail_quote">
<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>
<div class="h5">
<div>
<blockquote type="cite">
<div>
<div dir="ltr" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
<div class="gmail_extra">
<div class="gmail_quote">
<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">
<div style="word-wrap:break-word">
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79,129,135)">
<div style="font-family:Helvetica;font-size:12px"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(146,146,146)">
<br></span></div>
<div style="font-family:Helvetica;font-size:12px"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(146,146,146)">
Of course, I would love being able to use an initializer setup, but
there are serious bugs in the implementation.</span></div>
<div style="font-family:Helvetica;font-size:12px"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(146,146,146)">
<br></span></div>
<div style="font-family:Helvetica;font-size:12px">
<pre style="font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:0.94em;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;background-color:rgb(248,248,248);border:1px solid rgb(204,204,204);white-space:pre-wrap;word-wrap:break-word;padding:5px"></pre>
<div style="white-space:normal;font-family:Helvetica;font-size:12px">
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,143,1)">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(146,146,146)">
<span style="font-variant-ligatures:no-common-ligatures">protocol</span><span style="font-variant-ligatures:no-common-ligatures"> Clonable</span></span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">{</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">init</span><span style="font-variant-ligatures:no-common-ligatures">(other: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(73,134,114)">Self</span><span style="font-variant-ligatures:no-common-ligatures">)</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">}</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,143,1)">
<span style="font-variant-ligatures:no-common-ligatures">extension</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(95,174,174)">Clonable</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">{</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">func</span><span style="font-variant-ligatures:no-common-ligatures"> clone()
-> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(73,134,114)">Self</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">{ </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">return</span><span style="font-variant-ligatures:no-common-ligatures"> type(of: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">self</span><span style="font-variant-ligatures:no-common-ligatures">).</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">init</span><span style="font-variant-ligatures:no-common-ligatures">(o<wbr>ther: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">self</span><span style="font-variant-ligatures:no-common-ligatures">)
}</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">}</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(95,174,174)">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">class</span><span style="font-variant-ligatures:no-common-ligatures"> Base: </span><span style="font-variant-ligatures:no-common-ligatures">Clonable</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">{</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">var</span><span style="font-variant-ligatures:no-common-ligatures"> x: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(91,38,153)">Int</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br class="m_-311399833560624468m_-602078394375739685webkit-block-placeholder">
</div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">init</span><span style="font-variant-ligatures:no-common-ligatures">(x: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(91,38,153)">Int</span><span style="font-variant-ligatures:no-common-ligatures">)</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">{ </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">self</span><span style="font-variant-ligatures:no-common-ligatures">.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">x</span><span style="font-variant-ligatures:no-common-ligatures"> =
x }</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br class="m_-311399833560624468m_-602078394375739685webkit-block-placeholder">
</div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,143,1)">
<span style="font-variant-ligatures:no-common-ligatures">required</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures">init</span><span style="font-variant-ligatures:no-common-ligatures">(other: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(95,174,174)">Base</span><span style="font-variant-ligatures:no-common-ligatures">)</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">{ </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">self</span><span style="font-variant-ligatures:no-common-ligatures">.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">x</span><span style="font-variant-ligatures:no-common-ligatures"> =
other.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">x</span><span style="font-variant-ligatures:no-common-ligatures"> }</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">}</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">class</span><span style="font-variant-ligatures:no-common-ligatures"> Derived: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(95,174,174)">Base</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">{</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(91,38,153)">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">var</span><span style="font-variant-ligatures:no-common-ligatures"> y: </span><span style="font-variant-ligatures:no-common-ligatures">String</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br class="m_-311399833560624468m_-602078394375739685webkit-block-placeholder">
</div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">init</span><span style="font-variant-ligatures:no-common-ligatures">(x: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(91,38,153)">Int</span><span style="font-variant-ligatures:no-common-ligatures">,
y: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(91,38,153)">String</span><span style="font-variant-ligatures:no-common-ligatures">)</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">{</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">self</span><span style="font-variant-ligatures:no-common-ligatures">.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">y</span><span style="font-variant-ligatures:no-common-ligatures"> =
y</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">super</span><span style="font-variant-ligatures:no-common-ligatures">.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">init</span><span style="font-variant-ligatures:no-common-ligatures">(x:
x)</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">}</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br class="m_-311399833560624468m_-602078394375739685webkit-block-placeholder">
</div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(146,146,146)">
<span style="font-variant-ligatures:no-common-ligatures">// Should
be required by the Clonable protocol, but it isn't.</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,143,1)">
<span style="font-variant-ligatures:no-common-ligatures">required</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures">init</span><span style="font-variant-ligatures:no-common-ligatures">(other: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(95,174,174)">Derived</span><span style="font-variant-ligatures:no-common-ligatures">)</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">{</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">self</span><span style="font-variant-ligatures:no-common-ligatures">.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">y</span><span style="font-variant-ligatures:no-common-ligatures"> =
other.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">y</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">super</span><span style="font-variant-ligatures:no-common-ligatures">.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">init</span><span style="font-variant-ligatures:no-common-ligatures">(other:
other)</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">}</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br class="m_-311399833560624468m_-602078394375739685webkit-block-placeholder">
</div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(146,146,146)">
<span style="font-variant-ligatures:no-common-ligatures">//
Required because it was `required` in Base. Even a
`Derived` calls this initializer to clone, which is
wrong. Bugs abound.</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,143,1)">
<span style="font-variant-ligatures:no-common-ligatures">required</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures">init</span><span style="font-variant-ligatures:no-common-ligatures">(other: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(95,174,174)">Base</span><span style="font-variant-ligatures:no-common-ligatures">)</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(2,37,188)">
<span style="font-variant-ligatures:no-common-ligatures">{ </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(61,29,129)">fatalError</span><span style="font-variant-ligatures:no-common-ligatures">(</span><span style="font-variant-ligatures:no-common-ligatures">"init(other:)
is wrong."</span><span style="font-variant-ligatures:no-common-ligatures">) }</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures">}</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px">
<br></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">let</span><span style="font-variant-ligatures:no-common-ligatures"> me
= </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(95,174,174)">Derived</span><span style="font-variant-ligatures:no-common-ligatures">(x: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(218,32,0)">1</span><span style="font-variant-ligatures:no-common-ligatures">,
y: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(2,37,188)">"food"</span><span style="font-variant-ligatures:no-common-ligatures">)</span></div>
<div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(146,146,146)">
<span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,143,1)">let</span><span style="font-variant-ligatures:no-common-ligatures"> alienClone
= </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">me</span><span style="font-variant-ligatures:no-common-ligatures">.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(49,89,93)">clone</span><span style="font-variant-ligatures:no-common-ligatures">() </span><span style="font-variant-ligatures:no-common-ligatures">//
"init(other:) is wrong."</span></div>
<div><br></div>
</div>
</div>
</div>
</div>
</blockquote>
<div><br></div>
<div>Agree. That seems wrong. Great example.</div>
</div>
</div>
</div>
</div>
</blockquote>
<br></div>
</div>
</div>
<div>So, is this odd behavior intentional, a bug, or a design
deficiency? I would think that when a protocol has a method
or initializer has `Self` parameters—like in Clonable—every
subclass would be required to implement its own specialized version
(much like a required initializer). That would be a special
case of the protocol system, though.</div>
<div><br></div>
<div>As it sits, even fixing the calling behavior of my example
leaves us with the problem of subclasses inheriting inapplicable
required initializers from superclasses that actually don’t make
any sense.</div>
<div><br></div>
<div>Does this deserve its own thread?</div>
</div>
</blockquote>
<div><br></div>
<div>Dunno, maybe best to have its own thread. It's not mentioned
as part of SE-0068, but IMO a complete design that respects the
spirit of that proposal *should* involve allowing you to
write:</div>
<div><br></div>
<div>```</div>
<div>class Base : Clonable {</div>
<div> required init(other: Self) { ... }</div>
<div>}</div>
<div><br></div>
<div>class Derived : Base {</div>
<div> required init(other: Self) { ... }</div>
<div>}</div>
<div>```</div>
<div><br></div>
</div>
<br></div>
</div>
_______________________________________________<br>swift-evolution mailing list<br>swift-evolution@swift.org<br>https://lists.swift.org/mailman/listinfo/swift-evolution<br></div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>