[swift-evolution] [RFC] #Self

Vladimir.S svabox at gmail.com
Tue May 10 10:34:09 CDT 2016


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

class C: A {
     func a() -> Self { return self }
     func b(c: C) {} // b(c: #Self) ?
}


protocol A2 {
     var a: Self {get}
}

final class C2 : A2 {
     var a: C2 { return C2() } // #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: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
>


More information about the swift-evolution mailing list