如果我有一个通用的结构像…
struct Blah<T> { let someProperty: T }
然后我可以扩展Blah为Equatable仅当Tis 时才符合Equatable。喜欢…
Blah
Equatable
T
extension Blah: Equatable where T: Equatable { static func == (lhs: Blah, rhs: Blah) -> Bool { return lhs.someProperty == rhs.someProperty } }
这可能吗?
我尝试了几种不同的编码方式,但是每种方式都给我一个略有不同的错误。
更新: 条件一致性已在Swift 4.1中实现,您的代码
struct Blah<T> { let someProperty: T } extension Blah: Equatable where T: Equatable { static func == (lhs: Blah, rhs: Blah) -> Bool { return lhs.someProperty == rhs.someProperty } }
可以按照Xcode 9.3的要求进行编译和工作。
您正在寻找的是
(这又是“泛型宣言”的一部分)。该提案已被Swift 4接受,但尚未实施。从提案中:
条件一致性表示这样的概念,即泛型类型仅在其类型参数满足某些要求时才符合特定协议。
一个突出的例子是
extension Array: Equatable where Element: Equatable { static func ==(lhs: Array<Element>, rhs: Array<Element>) -> Bool { ... } }
使相等的元素数组相等,这是当前不可能的。您的例子本质上是
struct SomeWrapper<Wrapped> { let wrapped: Wrapped } extension SomeWrapper: Equatable where Wrapped: Equatable { static func ==(lhs: SomeWrapper<Wrapped>, rhs: SomeWrapper<Wrapper>) -> Bool { return lhs.wrapped == rhs.wrapped } }
从那个建议。