【问题标题】:Why does conforming to Strideable change how multiplication is evaluated?为什么遵守 Strideable 会改变乘法的评估方式?
【发布时间】:2019-03-20 02:02:06
【问题描述】:

我通过使 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())

在 Playground 中运行此代码会产生无休止的“Hello”流。如果struct T: Strideablestruct T: Equatable 替换,“true”会按我的预期打印。

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

为什么遵守 Strideable 会改变相等的实现方式,有没有办法在不手动实现 Equatable 的情况下恢复预期的行为?

【问题讨论】:

    标签: swift swift-protocols


    【解决方案1】:

    来自苹果文档:

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

    【讨论】:

    • 既然Temp的Stride类型是Int,为什么Apple的警告在这里适用?在我看来,Temp 不是它自己的 Stride 类型。
    • 哦,我明白了。 Strideable 中的 == 尝试查看两个值之间的距离是否为 0。这里的问题是它甚至无法在不知道相等性的情况下计算距离。我仍然想知道是否有办法避免写出成员平等。
    • 这里不需要覆盖 ==。您可以添加一个 int 属性来区分每个结构。在此处添加 location 属性,并确保每个属性都有唯一值。
    • 你可以在这里找到一个例子。 developer.apple.com/documentation/swift/strideable.
    • 不幸的是,在我的实际距离函数中,我需要将 self 与成员的特殊值进行比较,因为该值的距离计算方式不同。如果我想在距离函数中使用 == 作为成员相等,我必须手动实现成员相等(除非我弄错了)。
    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多