为什么符合Strideable会改变如何评估乘法?

问题描述 投票:0回答:1

我通过将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: Strideablestruct T: Equatable取代,“true”打印就像我期望的那样。

我怀疑对于符合Strideable的类型存在Equatable的默认实现,这与结构的自动合成实现不同,结构的成员都是等同的。我项目中的结构有很多成员,所以我不想手动实现成员比较。

为什么符合Strideable会改变如何实现相等性?有没有办法在不手动实现Equatable的情况下恢复预期的行为?

swift swift-protocols
1个回答
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")
}
}

或使用一些值来管理步幅属性。像var location : Int = 0

© www.soinside.com 2019 - 2024. All rights reserved.