[swift-evolution] [RFC] #Self

Vladimir.S svabox at gmail.com
Wed May 11 09:33:35 CDT 2016


On 11.05.2016 16:42, Matthew Johnson wrote:
> With #Self (or Type as we're now calling it) they would not need to
> override those requirements because the ancestor that initially declared
> conformance provides an inherited implementation that remains valid for
> all of its descendants.

OK.. I see your point, thank you. But probably we thinks differently about 
the #Self 'behavior' and how it should be treated in case of protocol 
conformance.

First of all, the initial proposal (which I base all my understanding on):
On 10.05.2016 16:15, Erica Sadun via swift-evolution wrote:
 >----------------------------------<
To focus SE-0068 and narrow its scope, I removed the `#Self` part of the 
proposal. This offered compile-time substitution of the defining type for a 
related #Self literal:

     A further static identifier, #Self expands to static type of the code 
it appears within, completing the ways code may want to refer to the type 
it is declared in.

         #Self expands to the static type of the code it is declared 
within. In value types, this is always the same as Self. In reference 
types, it refers to the declaring type. #Self will offer a literal textual 
replacement just like #file, etc.
 >----------------------------------<

So, again, we have protocol

protocol A {
   func f()->#Self
}

What does it mean for me? : Each class C, conformed to protocol A, should 
have func f() that returns exactly this class.

so, let's have

class B: A {
   func f()->B {} // conforms to protocol
// or could be written as(the same):
//func f()->#Self {} // conforms to protocol
}

class C: A {
   func f()->C {} // conforms to protocol
}

class D: A {
   func f()->D {} // conforms to protocol
}

and now, you want to conform some existed non-final class to A protocol:

class E {
   func f()->E {} // just has such method
}

extension E: A {} // seems like OK at this step

after this, what's the state of some existed derived from E classes ?

class F: E {}
class G: F {}

You conformed the base class E to A protocol. This automatically *reuqire* 
that F & G also conforms to A protocol. They *must* be `is A`.
But I insist, they does not conform to A protocol as I understand the #Self 
proposal.

F().f() *must*(because of protocol A) return instance of F, but F only has 
f()->C from base class

G().f() *must*(because of protocol A) return instance of G, but G only has 
f()->C from base class

This is why I don't understand how #Self could help to achieve the target 
with NSURL conformance.
These are my points. Please point if I'm wrong somewhere.


More information about the swift-evolution mailing list