我环顾四周,并没有看到我的问题的答案(但也许我应该可以推断一个)。
我有一个基于协议的对象。它是一个关联的类型协议,根据分配给关联类型的类型定义类操作符,如下所示:
protocol GenericBaseProtocol {
associatedtype T
var myProperty: T {get set}
init(_ myProperty: T )
}
extension GenericBaseProtocol where T: Equatable {
static func ==(lhs: Self, rhs: Self) -> Bool {
return lhs.myProperty == rhs.myProperty
}
}
因此,如果我创建一个基于此的类,并给T一个Equatable类型,就像这样:
class IntClass: GenericBaseProtocol {
typealias T = Int
var myProperty: T = 0
required init(_ myProperty: T ) {
self.myProperty = myProperty
}
}
结果对象应具有可比性,如下所示:
let lhs = IntClass(3)
let rhs = IntClass(4)
let isEqual = lhs == rhs
冷却。现在,如果我然后创建一个非Equatable类型的实例,如下所示:
class ArrayClass: GenericBaseProtocol {
typealias T = [String]
var myProperty: T = []
required init(_ myProperty: T ) {
self.myProperty = myProperty
}
}
并实例化,如下:
let lhs2A = ArrayClass(["HI"])
let rhs2A = ArrayClass(["Howaya"])
尝试此操作时,我会遇到编译时语法错误:
let isEqual = lhs2A == rhs2A
我希望能够做的是测试lhs2A的类对象,看看它是否实现了静态函数==(lhs:Self,rhs:Self) - >布尔
我不确定这可以做到,但如果我可以在操场上添加运行时/后卫证明,而不是简单地注释掉代码,那么我写这篇文章会很好。
有什么想法吗?
答案 0 :(得分:1)
如果关联类型不是Equatable,您可以扩展协议以为==运算符提供默认实现。
这也可用于提供类型与否相等的运行时指示器。
例如:
extension GenericBaseProtocol where T: Equatable {
static func ==(lhs: Self, rhs: Self) -> Bool {
return lhs.myProperty == rhs.myProperty
}
var isEquatable:Bool { return true }
}
extension GenericBaseProtocol {
static func ==(lhs: Self, rhs: Self) -> Bool {
return false
}
var isEquatable:Bool { return false }
}