[swift-evolution] [Draft] Introducing StaticSelf, an Invariant Self
Vladimir.S
svabox at gmail.com
Fri May 13 06:26:38 CDT 2016
I don't understand.
Right now we are allowed to have Optional(Self) :
protocol A {
func g()->Self?
}
class B: A {
func g()->Self? {return self}
}
print(B().g()) //Optional(main.B)
How do you want to divide your `->Self?` and this currently possible
`->Self?` ?
But I do like the idea to separate meaning of `Self` in protocol with some
marker.. What about `->?Self` and `->!Self` - no confusing with Optional<>
On 13.05.2016 14:21, LM via swift-evolution wrote:
>
> The other advantage of Self! over StaticSelf is that in code completion,
> Self, Self? Self! Will come together, giving people a quick tool to
> discover/remind themselves of the semantic difference right at the point of
> use.
>
> It might also address Joe's comment about StaticSelf not being much of a
> shortcut.
>
>
> On May 13, 2016, at 1:15 PM, LM <laurent.mihalkovic at gmail.com
> <mailto:laurent.mihalkovic at gmail.com>> wrote:
>
>> Considering the precedent of using ! and ? in swift, could it be that:
>>
>> Self! would designate what is known for sure, the invariant compile time
>> type of self
>>
>> Self? Would designate the yet unknown (*optional* if you will) covariant
>> type of self
>>
>>
>> Regards
>> LM
>> (From mobile)
>>
>> On May 13, 2016, at 3:59 AM, Xiaodi Wu via swift-evolution
>> <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>
>>> I like the way the motivation for this feature has been explained here.
>>> Now that the reasoning behind it is evident, I have to say I'm leaning
>>> towards the "InvariantSelf" name--after all, you describe this feature
>>> in the title as "an invariant self."
>>>
>>>
>>> On Thu, May 12, 2016 at 7:49 PM, Matthew Johnson via swift-evolution
>>> <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>
>>> Erica Sadun and I have written a proposal are following up the
>>> recent discussion thread "[RFC] #Self” with a proposal to introduce
>>> StaticSelf, an invariant Self.
>>>
>>> The recent discussion can be found
>>> here: http://thread.gmane.org/gmane.comp.lang.swift.evolution/16565
>>>
>>> The proposal can be found
>>> here: https://github.com/anandabits/swift-evolution/blob/static-self/proposals/NNNN-static-self.md
>>>
>>> We look forward to continuing the discussion. We plan to submit a
>>> PR in the near future after incorporating your final feedback.
>>>
>>> Thanks,
>>> Matthew
>>>
>>>
>>> Introducing StaticSelf, an Invariant Self
>>>
>>> * Proposal: TBD
>>> * Authors: Matthew Johnson <https://github.com/anandabits>, Erica
>>> Sadun <https://github.com/erica>
>>> * Status: TBD
>>> * Review manager: TBD
>>>
>>>
>>> Introduction
>>>
>>> This proposal introduces a new keyword that provides consistent
>>> invariant type semantics in all contexts.
>>>
>>> /The Swift-evolution thread about this topic can be found
>>> here: [RFC] #Self
>>> <http://thread.gmane.org/gmane.comp.lang.swift.evolution/16565>/
>>>
>>>
>>> Motivation
>>>
>>> The distinction between covariant and non-covariant type references
>>> come into play when
>>> conforming non-final classes to protocols. Fixing a protocol
>>> requirement to a covarying type
>>> means that a method returning |Self| must be overriden by all
>>> subclasses in order to return
>>> the correct, matching type.
>>>
>>> This proposal builds on the covariant construct |Self| accepted
>>> in SE–0068
>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0068-universal-self.md>
>>> to introduce an invariant type identifier. It enables protocol
>>> declarations to consistently
>>> refer to a type that is fixed at compile time. This ensures that
>>> subclasses can inherit
>>> protocol implementations without having to re-implement that code at
>>> each level of
>>> inheritance.
>>>
>>> Under this proposal, a new identifier keyword is fixed in use /at
>>> the point of protocol conformance/
>>> to the static type of that construct.
>>>
>>> |class A: MyProtocol|
>>>
>>> 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 { // ... } }|
>>>
>>>
>>> Additional Utility
>>>
>>> The utility of |StaticSelf| is not limited to protocols. A secondary
>>> use enables code to refer to the lexical context’s current type
>>> without explicitly mentioning its name. This provides a useful
>>> shortcut when referencing static type members with especially long
>>> names and when re-purposing code between types.
>>>
>>> |class StructWithAVeryLongName { static func foo() -> String { // ...
>>> } func bar() { // ... let s = StaticSelf.foo() // } }|
>>>
>>>
>>> Detailed Design
>>>
>>> This proposal introduces |StaticSelf|, a new keyword that may be
>>> used in protocols to refer to the invariant static type of a
>>> conforming construct. |StaticSelf| may also be used in the lexical
>>> context of any type declaration. In such use, the keyword is
>>> identical to spelling out the full name of that type.
>>>
>>>
>>> Impact on existing code
>>>
>>> Being additive, there should be no impact on existing code.
>>>
>>>
>>> Alternatives considered
>>>
>>> The keyword is not fixed at this time. Alternatives that have been
>>> discussed include |StaticType|, |InvariantSelf|, |SelfType|,
>>> or |Type|. The community is welcome to bikeshed on the most clear
>>> and concise name for this keyword.
>>>
>>>
>>> _______________________________________________
>>> 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 <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