[swift-evolution] Should we rename "class" when referring to protocol conformance?

Tyler Fleming Cloutier cloutiertyler at aol.com
Sat May 7 04:19:58 CDT 2016


> On May 4, 2016, at 3:50 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 
> on Wed May 04 2016, Matthew Johnson <swift-evolution at swift.org <mailto: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.

Hmm, I get the feeling that I was arguing your own point back at you. Sorry, Dave, I’m a little slow. :)

Still, how would you generate an equality operator for a data structure that requires wrapper classes currently, like a LinkedList?

> 
>> 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
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160507/e0d02604/attachment.html>


More information about the swift-evolution mailing list