如果我有一个类似的通用结构......
struct Blah<T> {
let someProperty: T
}
我可以在Blah
为Equatable
时将T
扩展为符合Equatable
。像...
extension Blah: Equatable where T: Equatable {
static func == (lhs: Blah, rhs: Blah) -> Bool {
return lhs.someProperty == rhs.someProperty
}
}
这可能吗?
我尝试过几种不同的编码方式,但每种方法都给我一个稍微不同的错误。
答案 0 :(得分:11)
更新:在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中编译并按预期工作。
您正在寻找的是
(反过来又是"Generics Manifesto"的一部分)。 该提案已被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
}
}
来自该提案。