首页 > 解决方案 > 为什么遵守 Strideable 会改变乘法的评估方式?

问题描述

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

标签: swiftswift-protocols

解决方案


它来自苹果文件:

重要 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


推荐阅读