[swift-evolution] Should we rename "class" when referring to protocol conformance?
Dave Abrahams
dabrahams at apple.com
Wed May 4 17:50:36 CDT 2016
on Wed May 04 2016, Matthew Johnson <swift-evolution at swift.org> wrote:
>> On May 4, 2016, at 1:29 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>>
>>
>> on Wed May 04 2016, Adrian Zubarev <swift-evolution at swift.org> wrote:
>>
>
>>> Not sure what to think about the enum cases inside a protocol (if AnyEnum would
>>> even exist), it could be a nice addition to the language, but this is an own
>>> proposal I guess.
>>>
>>> We should start by adding AnyValue protocol to which all value types
>>> conforms.
>>
>> Having a way to constrain conformance to things with value semantics is
>> something I've long wanted. *However*, the approach described is too
>> simplistic. It's possible to build classes whose instances have value
>> semantics (just make them immutable) and it's possible to build structs
>> whose instances have reference semantics (just put the struct's storage
>> in a mutable class instance that it holds as a property, and don't do
>> copy-on-write).
>>
>> In order for something like AnyValue to have meaning, we need to impose
>> greater order. After thinking through many approaches over the years, I
>> have arrived at the (admittedly rather drastic) opinion that the
>> language should effectively outlaw the creation of structs and enums
>> that don't have value semantics. (I have no problem with the idea that
>> immutable classes that want to act as values should be wrapped in a
>> struct). The language could then do lots of things much more
>> intelligently, such as correctly generating implementations of equality.
>
> That is a drastic solution indeed! How would this impact things like
> Array<UIView>? While Array itself has value semantics, the aggregate
> obviously does not as it contains references which usually be mutated
> underneath us.
Value semantics and mutation can only be measured with respect to
equality. The definition of == for all class types would be equivalent
to ===. Problem solved.
> Similar considerations apply to simpler wrapper structs such as Weak.
Same answer.
> My expectation is a generic aggregate such as Array would have to
> conditionally conform to AnyValue only when Element also conforms to
> AnyValue.
>
> I’m also wondering how such a rule would be implemented while still
> allowing for CoW structs that *do* implement value semantics, but do
> so while using references internally.
I am not talking about any kind of statically-enforceable rule, although
we could probably make warnings sophisticated enough to help with this.
>
> If the compiler can be sophisticated enough to verify value semantics
> statically maybe it would be better to have that mechanism be
> triggered by conformance to AnyValue rather than for all structs and
> enums. Types that conform to AnyValue would receive the benefits of
> the compiler knowing they have value semantics, while other uses of
> structs and enums would remain valid. Best practice would be to
> conform structs and enums to AnyValue whenever possible.
>
> Another possible advantage of this approach would be allowing
> immutable reference types to conform to AnyValue and receive the
> associated benefits such as the generated implementation of equality,
> etc.
>
> -Matthew
>
>>
>>
>> --
>> Dave
>>
>> _______________________________________________
>> 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
--
Dave
More information about the swift-evolution
mailing list