I'm pretty sure solutions like the one you proposed are impossible, 
unfortunately :(. The compiler has to choose the static override at compile 
time, but it can't tell until runtime whether the type conforms to `Equatable` 
or not (because of retroactive conformance).

It's also not possible to use the as or is dynamic casting machinery to work 
with `Equatable`, because of the use of the `Self` type in its requirements.

A feature that the community has expressed interest in, "generalized 
existentials", may allow you to implement a function that does what you want.

Best,
Austin


> On Jul 3, 2017, at 5:00 PM, David Baraff via swift-users 
> <swift-users@swift.org> wrote:
> 
> I’m searching for the simplest way to write a function
>       func maybeEqual<T>(_ lhs:T, _rhs:T) -> Bool
> 
> where it returns lhs == rhs if T is equatable, and false, otherwise.
> I tried
> 
> func maybeEqual<T>(_ lhs:T, _rhs:T) -> Bool {
>     return false
> }
> 
> func maybeEqual<T:Equatable>(_ lhs:T, _ rhs:T) -> Bool {
>     return lhs == rhs
> }
> 
> but that doesn’t work.  Is there a way to express a type not matching 
> something?
> Alternately, how can I write this?
> 
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to