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.

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to