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