我通过使Swift结构符合Strideable协议创建了一个无限循环。我将问题简化为以下情况。
struct T: Strideable {
func advanced(by n: Int) -> T { return T() }
func distance(to other: T) -> Int {
print("Hello")
return self == T() ? 0 : 1
}
}
print(T() == T())
在操场上运行此代码会导致源源不断的“ Hello”。如果将struct T: Strideable
替换为struct T: Equatable
,则将按我期望的那样输出“ true”。
我怀疑对于符合Strideable的类型,存在Equatable的默认实现,这与对其成员都是Equatable的结构的自动综合实现不同。我项目中的结构有很多成员,所以我不想手动实现成员间的比较。
为什么遵守Strideable会改变实现平等的方式,并且有一种方法可以在不手动实现Equatable的情况下恢复预期的行为?
答案 0 :(得分:1)
来自苹果文档:
重要 Strideable协议为等于(==)和小于(<)运算符的默认实现提供了依据,具体取决于Stride类型的实现。如果符合Strideable的类型是其自己的Stride类型,则它必须提供这两个运算符的具体实现,以避免无限递归。
因此,您可以像这样提供“ ==”和“ <”实现:
struct Temp: Strideable {
var error = 1
func advanced(by n: Int) -> Temp { return Temp() }
func distance(to other: Temp) -> Int {
print("hello")
return self == other ? 0 : 1
}
static func == (left : T, right: T){
print("great")
}
}
或使用一些值来管理stride属性。像var location : Int = 0