[swift-evolution] [Draft] Introducing StaticSelf, an Invariant Self
Patrick Smith
pgwsmith at gmail.com
Fri May 13 01:45:28 CDT 2016
Could protocol Self change to just the first behaviour for classes?
If a conformance absolutely needs to have a method returning ‘only me but not my subclasses’, then it sets that conforming method to be final.
> On 13 May 2016, at 4:38 PM, Vladimir.S <svabox at gmail.com> wrote:
>
> The proposed StaticSelf when used as `->StaticSelf` in protocol means ‘myself or my some *base* class’. I.e. if this requirement was implemented in one of base classes, any subclass automatically conforms to the protocol as it has `->(myself or some base class)` in his hierarchy.
>
> This is the difference with `->Self` in protocol which requires 'myself'.
>
> On 13.05.2016 7:21, Patrick Smith via swift-evolution wrote:
>> I didn’t really understand some of the lead in discussion examples
>> regarding protocols A and B each being interwoven, but I would prefer to
>> see StaticSelf only used for concrete types, and protocols only to use
>> Self. If Self has problems with non-final classes, then maybe how it
>> works in protocols could change. A class could interpret a protocol’s
>> ‘Self’ as ‘myself or my subclasses’?
>>
>> Maybe instead of introducing StaticSelf it could be renamed simply Self,
>> and ‘Self’ as used in protocols could change to something else?
>> ‘Instance’ perhaps?
>>
>>> On 13 May 2016, at 12:21 PM, Joe Groff via swift-evolution
>>> <swift-evolution at swift.org> wrote:
>>>
>>>
>>>> On May 12, 2016, at 5:49 PM, Matthew Johnson via swift-evolution
>>>> <swift-evolution at swift.org> wrote:
>>>>
>>>> The invariant StaticSelf identifier will always refer to A, unlike
>>>> Self, which is covarying and refers to the type of the actual
>>>> instance. Since multiple inheritance for non-protocol types is
>>>> disallowed, this establishes this invariant type identifier with no
>>>> possibility for conflict.
>>>>
>>>> Consider the following example, under the current system:
>>>>
>>>> protocol StringCreatable {
>>>>
>>>> static func createWithString(s: String) -> Self
>>>>
>>>> }
>>>>
>>>>
>>>> extension NSURL: StringCreatable {
>>>>
>>>> // cannot conform because NSURL is non-final
>>>>
>>>>
>>>> // error: method 'createWithString' in non-final class 'NSURL' must
>>>> return `Self` to conform to protocol 'A'
>>>>
>>>> }
>>>>
>>>> Introducing a static, invariant version of Self permits the desired
>>>> conformance:
>>>>
>>>> protocol StringCreatable {
>>>>
>>>> static func createWithString(s: String) -> StaticSelf
>>>>
>>>> }
>>>>
>>>>
>>>> extension NSURL: StringCreatable {
>>>>
>>>> // can now conform conform because NSURL is fixed and matches the
>>>> static
>>>>
>>>>
>>>> // type of the conforming construct. Subclasses need not
>>>> re-implement
>>>>
>>>>
>>>> // NOTE: the return type can be declared as StaticSelf *or* as
>>>> NSURL
>>>>
>>>>
>>>> // they are interchangeable
>>>>
>>>>
>>>> static func createWithString(s: String) -> StaticSelf {
>>>>
>>>> // ...
>>>>
>>>> } }
>>>>
>>>>
>>>
>>> As I've noted before, I don't think this makes sense to encode in the
>>> protocol. `Self` is already effectively invariant within a protocol.
>>> If a protocol doesn't have the foresight to use StaticSelf, then you
>>> still have the same problems retroactively conforming class
>>> hierarchies to the protocol. Whether a conformance is inherited or not
>>> feels more natural as a property of a conformance, not something that
>>> can be legislated a priori by a protocol definition.
>>>
>>> Something like StaticSelf might still be useful as shorthand within a
>>> class definition with a long-winded name, though `StaticSelf` feels
>>> kind of long as a shortcut to me.
>>>
>>> -Joe _______________________________________________ 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