swift - 为什么遵守 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 的情况下恢复预期的行为?
解决方案
它来自苹果文件:
重要 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
推荐阅读
- spring - InvalidDataAccessApiUsageException:没有枚举常量
- windows - 使用 ansible 进行远程 wsus 查询:401 未经授权使用有效帐户
- c++ - 导入 .tlb,生成 .tlh 给出:枚举类型的前向声明是非标准的
- java - 如何在代码运行时将随机生成的字符串和整数添加到数组中?
- r - 如何使用 distHarvesine() 有效地使用经度和纬度数据?
- ios - 尝试集成 Facebook iOS SDK 时出现链接错误
- javascript - 用于从表单中添加复选框的 JavaScript 函数
- flutter - Flutter SDK安装未完成
- c# - 在 .Net 中使用动力学重载方法
- node.js - 如何在 node-pg-migrate 迁移中插入记录?