我通过将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的默认实现,这与结构的自动合成实现不同,结构的成员都是等同的。我项目中的结构有很多成员,所以我不想手动实现成员比较。
为什么符合Strideable会改变如何实现相等性?有没有办法在不手动实现Equatable的情况下恢复预期的行为?
这是来自苹果文件:
重要说明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")
}
}
或使用一些值来管理步幅属性。像var location : Int = 0