@swift-5.1.5
protocol AnyEquatableBase { associatedtype Value var value: Value { get } func isEqual(to other: Self) -> Bool } extension AnyEquatableBase { func isEqual(to other: Self) -> Bool { false } } extension AnyEquatableBase where Value: Equatable { func isEqual(to other: Self) -> Bool { value == other.value } } struct AnyEquatable<T>: AnyEquatableBase { var value: T } func check<T>(lhs: T, rhs: T) { print(AnyEquatable(value: lhs)) print(AnyEquatable(value: lhs).isEqual(to: AnyEquatable(value: rhs))) } func check2(lhs: String, rhs: String) { print(AnyEquatable(value: lhs)) print(AnyEquatable(value: lhs).isEqual(to: AnyEquatable(value: rhs))) } check(lhs: "test", rhs: "test") check2(lhs: "test", rhs: "test")