<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">I have no problem with the syntax proposed in SE-0068.<br>The rationale briefly mentions that dynamic <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Self</code> will be used anywhere inside the class body. I think that the possibilities that open with this decision should be mentioned in the proposal.</p>
<p style="margin:0px 0px 1.2em!important">We can say that non-final classes, apart from that they can also have instances of themselves, behave very much like protocol existentials. They couple requirements and “default implementation”. Like existential protocols, they can’t have associated types. SE-0068 expands abilities of classes and allows their requirements to contain <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Self</code>. “Default” implementation is mandatory, as usual. Example of code that will be possible:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important">// Compiles now

protocol P {
    init()
    func foo(_ x: Self) -&gt; Self
}

extension P {
    func foo(_ x: Self) -&gt; Self {
        print(Self.self)
        return Self.init()
    }
}

struct S : P { }

let x = S()
_ = x.foo(x)  // prints &quot;S&quot;

// Will compile after implementation of SE-0068

class A {
    required init() {
    }

    func foo(_ x: Self) -&gt; Self {
        print(Self.self)
        return Self.init()
    }
}

class B : A { }

let y = B()
_ = y.foo(y)  // prints &quot;B&quot;
</code></pre><p style="margin:0px 0px 1.2em!important">I find that consistent enough. The annoyance is that we don’t and won’t have the ability to implement protocol requirements with <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Self</code> in classes without <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Self</code>. This is an error:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important">protocol P {
    func foo() -&gt; Self
}

class A {
    func foo() -&gt; A { ... }
}

class B : A {
    override func foo() -&gt; B { ... }
}
</code></pre><p style="margin:0px 0px 1.2em!important">The fact that we can’t get rid of <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Self</code> in implementation is an abstraction leak.</p>
<p style="margin:0px 0px 1.2em!important">As a side note, seeing <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Self.self</code>, I really look forward to refactoring <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Self</code>, <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">self</code>, <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Type</code>, <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Protocol</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">MemoryLayout</code>.</p>
<div title="MDH:PGRpdj5JIGhhdmUgbm8gcHJvYmxlbSB3aXRoIHRoZSBzeW50YXggcHJvcG9zZWQgaW4gU0UtMDA2
OC48L2Rpdj48ZGl2PlRoZSByYXRpb25hbGUgYnJpZWZseSBtZW50aW9ucyB0aGF0IGR5bmFtaWMg
YFNlbGZgIHdpbGwgYmUgdXNlZCBhbnl3aGVyZSBpbnNpZGUgdGhlIGNsYXNzIGJvZHkuIEkgdGhp
bmsgdGhhdCB0aGUgcG9zc2liaWxpdGllcyB0aGF0IG9wZW4gd2l0aCB0aGlzIGRlY2lzaW9uIHNo
b3VsZCBiZSBtZW50aW9uZWQgaW4gdGhlIHByb3Bvc2FsLjwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxk
aXY+V2UgY2FuIHNheSB0aGF0IG5vbi1maW5hbCBjbGFzc2VzLCBhcGFydCBmcm9tIHRoYXQgdGhl
eSBjYW4gYWxzbyBoYXZlIGluc3RhbmNlcyBvZiB0aGVtc2VsdmVzLCBiZWhhdmUgdmVyeSBtdWNo
IGxpa2UgcHJvdG9jb2wgZXhpc3RlbnRpYWxzLiBUaGV5IGNvdXBsZSByZXF1aXJlbWVudHMgYW5k
ICJkZWZhdWx0IGltcGxlbWVudGF0aW9uIi4gTGlrZSBleGlzdGVudGlhbCBwcm90b2NvbHMsIHRo
ZXkgY2FuJ3QgaGF2ZSBhc3NvY2lhdGVkIHR5cGVzLiBTRS0wMDY4IGV4cGFuZHMgYWJpbGl0aWVz
IG9mIGNsYXNzZXMgYW5kIGFsbG93cyB0aGVpciByZXF1aXJlbWVudHMgdG8gY29udGFpbiBgU2Vs
ZmAuICJEZWZhdWx0IiBpbXBsZW1lbnRhdGlvbiBpcyBtYW5kYXRvcnksIGFzIHVzdWFsLiBFeGFt
cGxlIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHBvc3NpYmxlOjwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxk
aXY+YGBgPC9kaXY+PGRpdj4vLyBDb21waWxlcyBub3c8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2
PnByb3RvY29sIFAgezwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBpbml0KCk8L2Rpdj48ZGl2PiZu
YnNwOyAmbmJzcDsgZnVuYyBmb28oXyB4OiBTZWxmKSAtJmd0OyBTZWxmPC9kaXY+PGRpdj59PC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj5leHRlbnNpb24gUCB7PC9kaXY+PGRpdj4mbmJzcDsgJm5i
c3A7IGZ1bmMgZm9vKF8geDogU2VsZikgLSZndDsgU2VsZiB7PC9kaXY+PGRpdj4mbmJzcDsgJm5i
c3A7ICZuYnNwOyAmbmJzcDsgcHJpbnQoU2VsZi5zZWxmKTwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNw
OyAmbmJzcDsgJm5ic3A7IHJldHVybiBTZWxmLmluaXQoKTwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNw
OyB9PC9kaXY+PGRpdj59PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5zdHJ1Y3QgUyA6IFAgeyB9
PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5sZXQgeCA9IFMoKTwvZGl2PjxkaXY+XyA9IHguZm9v
KHgpICZuYnNwOy8vIHByaW50cyAiUyI8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pi8vIFdpbGwg
Y29tcGlsZSBhZnRlciBpbXBsZW1lbnRhdGlvbiBvZiBTRS0wMDY4PC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj5jbGFzcyBBIHs8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgcmVxdWlyZWQgaW5pdCgp
IHs8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgfTwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Jm5i
c3A7ICZuYnNwOyBmdW5jIGZvbyhfIHg6IFNlbGYpIC0mZ3Q7IFNlbGYgezwvZGl2PjxkaXY+Jm5i
c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHByaW50KFNlbGYuc2VsZik8L2Rpdj48ZGl2PiZuYnNw
OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyByZXR1cm4gU2VsZi5pbml0KCk8L2Rpdj48ZGl2PiZuYnNw
OyAmbmJzcDsgfTwvZGl2PjxkaXY+fTwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Y2xhc3MgQiA6
IEEgeyB9PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5sZXQgeSA9IEIoKTwvZGl2PjxkaXY+XyA9
IHkuZm9vKHkpICZuYnNwOy8vIHByaW50cyAiQiI8L2Rpdj48ZGl2PmBgYDwvZGl2PjxkaXY+PGJy
PjwvZGl2PjxkaXY+SSBmaW5kIHRoYXQgY29uc2lzdGVudCBlbm91Z2guIFRoZSBhbm5veWFuY2Ug
aXMgdGhhdCB3ZSBkb24ndCBhbmQgd29uJ3QgaGF2ZSB0aGUgYWJpbGl0eSB0byBpbXBsZW1lbnQg
cHJvdG9jb2wgcmVxdWlyZW1lbnRzIHdpdGggYFNlbGZgIGluIGNsYXNzZXMgd2l0aG91dCBgU2Vs
ZmAuIFRoaXMgaXMgYW4gZXJyb3I6PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5gYGA8L2Rpdj48
ZGl2PnByb3RvY29sIFAgezwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBmdW5jIGZvbygpIC0mZ3Q7
IFNlbGY8L2Rpdj48ZGl2Pn08L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmNsYXNzIEEgezwvZGl2
PjxkaXY+Jm5ic3A7ICZuYnNwOyBmdW5jIGZvbygpIC0mZ3Q7IEEgeyAuLi4gfTwvZGl2PjxkaXY+
fTwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Y2xhc3MgQiA6IEEgezwvZGl2PjxkaXY+Jm5ic3A7
ICZuYnNwOyBvdmVycmlkZSBmdW5jIGZvbygpIC0mZ3Q7IEIgeyAuLi4gfTwvZGl2PjxkaXY+fTwv
ZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGUgZmFjdCB0aGF0IHdlIGNh
bid0IGdldCByaWQgb2YgYFNlbGZgIGluIGltcGxlbWVudGF0aW9uIGlzIGFuIGFic3RyYWN0aW9u
IGxlYWsuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5BcyBhIHNpZGUgbm90ZSwgc2VlaW5nIGBT
ZWxmLnNlbGZgLCBJIHJlYWxseSBsb29rIGZvcndhcmQgdG8gcmVmYWN0b3JpbmcgYFNlbGZgLCBg
c2VsZmAsIGBUeXBlYCwgYFByb3RvY29sYCBhbmQgYE1lbW9yeUxheW91dGAuPC9kaXY+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>