[swift-evolution] [RFC] #Self

Matthew Johnson matthew at anandabits.com
Tue May 10 10:47:07 CDT 2016


> 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)
}

> 
> 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.

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.

> 
> 
> 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.

> 
> 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:swift-evolution at swift.org>> 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.
>>>> 
>>>> At Chris's suggestion, I'm starting a new SE thread to see whether there
>>>> remains any interest for including #Self in the language. I'm personally
>>>> happy with the SE-0068 outcome but I didn't want to undercut anyone like
>>>> Timothy Wood who had originally spoken up for its inclusion.
>>>> 
>>>> -- E
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution



More information about the swift-evolution mailing list