[swift-evolution] [RFC] #Self

Matthew Johnson matthew at anandabits.com
Tue May 10 11:37:45 CDT 2016



Sent from my iPad

> On May 10, 2016, at 11:25 AM, Vladimir.S <svabox at gmail.com> wrote:
> 
> Thank you for answers, just to clarify:
> 
>> On 10.05.2016 18:47, Matthew Johnson wrote:
>> 
>>> On May 10, 2016, at 10:34 AM, Vladimir.S via swift-evolution
>>> <swift-evolution at swift.org> wrote:
>>> 
>>> What about #Self in protocols? I.e. is it proposed to have #Self in
>>> protocols, where conformance will require a substitution by real type
>>> name?
>>> 
>>> protocol A { func a() -> Self func b(c: Self) // b(c: #Self)   ? }
>> 
>> Self and #Self are different for non-final classes.  In protocol
>> requirements Self would covary and #Self would be fixed by the class
>> that provides conformance.  The distinction is pretty subtle and is
>> 
>> protocol A { func a() -> Self func b(c: #Self) }
> 
> Yes, Self and #Self sometimes is not the same, and sometimes is the same.
> Here I asked about b() method. No questions regarding a() method.
> 
> So, after #Self will be introduced, this definition will be correct:
> 
> protocol A {
>    func a() -> Self
>    func b(c: #Self)
> }
> 
> and be exactly the same as
> 
> protocol A {
>    func a() -> Self
>    func b(c: Self)
> }
> 
> Will both variants coexist? I'd prefer compiler to be strict in this case and allows only #Self in b() method, as this is more correct and explicit declaration, i.e. func b(c: Self) in protocol A really means func b(c: #Self). No?

Agree.

> 
>> 
>>> 
>>> class C: A { func a() -> Self { return self } func b(c: C) {} // b(c:
>>> #Self) ? }
>> 
>> C is non-final so we must be careful.  C and #Self both refer to the
>> same thing.  Self covaries and would thus refer to the dynamic type of
>> the instance in both signatures and bodies.  This means that a method
>> returning Self must be overridden by all subclasses in order to return
>> the correct type.
> 
> Yes, I believe it is all clear with a() method. This is why I placed the commend with #Self for `b` method only
> 
>> 
>> One of the advantages of allowing #Self in protocol requirements is that
>> it is one way to solve a problem that has receive significant discussion
>> on the list in the past: retroactively conforming non-final classes to
>> protocols with factory methods that do not need to covary.  There is no
>> way to express a this kind of requirement in the language today.
>> 
> 
> 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.

> 
>>> 
>>> 
>>> protocol A2 { var a: Self {get} }
>>> 
>>> final class C2 : A2 { var a: C2 { return C2() } // #Self { return
>>> #Self() }  ? }
>> 
>> In final classes and value types the type name itself (C2 in this
>> example), Self, and #Self would all reference the same thing.
>> 
> 
> Exactly in my example, you can't use `Self` keyword in class:
> 
> final class C2 : A2 {
>    var a: Self { return Self() } // error
> }
> 
> but I expect to be able to have:
> 
> final class C2 : A2 {
>    var a: #Self { return #Self() }
> }
> 
>>> 
>>>> On 10.05.2016 17:50, Erica Sadun via swift-evolution wrote:
>>>> As a compile-time substitution, it could be used in any and all of
>>>> the examples in your bullet list as a literal text replacement..
>>>> 
>>>> Quick rundown:
>>>> 
>>>> struct A { ...#Self... // #Self is substituted by A }
>>>> 
>>>> class B { ...#Self... // Self is substituted by B }
>>>> 
>>>> class C { ... #Self... // Self is substituted by C, which is the
>>>> defining type at compile time }
>>>> 
>>>> I'm stepping away from endorsing or pushing this forward. If you
>>>> want to pick this up and run with it, it's yours.
>>>> 
>>>> -- E
>>>> 
>>>> 
>>>>> On May 10, 2016, at 8:34 AM, Matthew Johnson
>>>>> <matthew at anandabits.com <mailto:matthew at anandabits.com>> wrote:
>>>>> 
>>>>> Can you clarify where would #Self would be allowed?
>>>>> 
>>>>> * property declarations * method signatures * method and computed
>>>>> property bodies * all of the above
>>>>> 
>>>>> I would like to see this and allowed in all of the above.
>>>>> 
>>>>> We should also consider allowing this in protocol requirements.
>>>>> It would not covary like Self does for return types, instead being
>>>>> fixed by the class that declares conformance.
>>>>> 
>>>>> Sent from my iPad
>>>>> 
>>>>> On May 10, 2016, at 8:15 AM, Erica Sadun via swift-evolution
>>>>> <swift-evolution at swift.org <mailto:sw



More information about the swift-evolution mailing list