[swift-evolution] [RFC] #Self

Vladimir.S svabox at gmail.com
Tue May 10 12:33:46 CDT 2016


As I understand, please correct me, this proposal will not solve this 
problem. The proposed solution just to introduce #Self as replacement for 
concrete name of currently declared type.

And actually I think(I don't understand?) something is wrong with what you 
want to achieve..

Let's imagine we have non-final class:

class C {
     static func f() -> C { return C() }
}

and, as class is not final, we can have subclasses :

class D : C {
}

Now we introduce the protocol:

protocol A {
     static func f() -> #Self  // let's imagine #Self can be in this place
                           // in test code I used C instead of #Self here
}

And conform C to A, so this says "C will return C when we call f()"

extension C: A {
   // let's imagine it is OK here, C.f() returns #Self which is C
}

But now, we have a problem with D - as C conforms to protocol A, D also 
conforms to protocol A :

var c = C()
var d = D()

if c is A {print("c is A")}  // c is A
if d is A {print("d is A")}  // d is A

But...

print(C.f())  // main.C
print(D.f())  // main.C oops! D.f() does not return its #Self, i.e. main.D


On 10.05.2016 19:37, Matthew Johnson wrote:
>>> Could you please illustrate this in a couple lines of code? Just to
>>> fully understand.
> protocol A { static func createWithString(s: String) -> Self }
>
> extension NSURL: A { // cannot conform because NSURL is non-final }
>
> If we could define a protocol requirement that didn't covary (using
> #Self or whatever) we would be able to write the desired conformance.
>


More information about the swift-evolution mailing list