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

Dave Abrahams dabrahams at apple.com
Thu May 5 16:59:53 CDT 2016


on Wed May 04 2016, Matthew Johnson <matthew-AT-anandabits.com> wrote:

>     On May 4, 2016, at 5: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> 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.
>
> Hmm. If those qualify as “value semantic” then what kind of structs and enums
> would not? A struct wrapping a mutable reference type certainly doesn’t “feel”
> value semantic to me and certainly doesn’t have the guarantees usually
> associated with value semantics (won’t mutate behind your back, thread safe,
> etc).

Sure it does.

     public struct Wrap<T: AnyObject> : Equatable {
       init(_ x: T) { self.x = x }
       private x: T
     }

     func == <T>(lhs: Wrap<T>, rhs: Wrap<T>) -> Bool {
       return lhs.x === rhs.x
     }

I defy you to find any scenario where Wrap<T> doesn't have value
semantics, whether T is mutable or not.

Alternately, you can look at the Array implementation.  Array is a
struct wrapping a mutable class.  It has value semantics by virtue of
CoW.

>         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.
>
> You said the you have arrived at the opinion that the language should
> “effectively outlaw” structs and enums that do not have value semantics. That
> sounded like static enforcement to me. 

The language outlaws certain kinds of inout aliasing without providing static
enforcement.  This is like that.

> Maybe you meant we should allow the compiler to assume value semantics
> for structs and enums despite the fact that it doesn’t statically
> enforce this?

That would be one *consequence* of effectively outlawing it.  The library
could make similar assumptions.

>         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
>     https://lists.swift.org/mailman/listinfo/swift-evolution
>

-- 
Dave


More information about the swift-evolution mailing list