为什么遵循可跨越性改变乘法的评估方式?

时间:2019-03-20 02:02:07

标签: swift swift-protocols

我通过使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的情况下恢复预期的行为?

1 个答案:

答案 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