【问题标题】:Swift, Equatable protocol bug?Swift,Equatable 协议错误?
【发布时间】:2014-08-09 14:11:14
【问题描述】:

我正在 Swift 中构建一个非常简单的结构,其中包含一组可选值。该结构必须符合 Equatable 协议。这是代码:

struct MyTable: Equatable {
    var values: [Int?] = Array(count: 64, repeatedValue: nil)
}

func == (lhs: MyTable, rhs: MyTable) -> Bool {
    return lhs.values == rhs.values
}

很简单。我没有看到任何错误,但编译器给出了错误:“'[Int?]' is not convertible to 'MyTable'”。我在做傻事吗?或者这是编译器的错误?谢谢!

(使用 Xcode6-Beta5)

【问题讨论】:

  • 如果'values'数组被声明为[Int] instad of [Int?],一切正常。为什么不使用 [Int?]?

标签: xcode swift xcode6


【解决方案1】:

它不起作用的原因是没有为具有可选元素的数组定义==运算符,仅针对非可选元素:

/// Returns true if these arrays contain the same elements.
func ==<T : Equatable>(lhs: [T], rhs: [T]) -> Bool

您可以提供自己的:

func ==<T : Equatable>(lhs: [T?], rhs: [T?]) -> Bool {
    if lhs.count != rhs.count {
        return false
    }

    for index in 0..<lhs.count {
        if lhs[index] != rhs[index] {
            return false
        }
    }

    return true
}

【讨论】:

  • 哦!我忽略了这一点。奇怪的是它没有定义...谢谢!
  • 太棒了。谢谢老哥!
【解决方案2】:

另一个有用的选项是使用SequenceType 上可用的elementsEqual:isEquivalent: 方法。这可以让您避免实现Equatable,但最好很少使用,因为它更冗长。

用法:

let a: [Int?] = []
let b: [Int?] = []

if a.elementsEqual(b, isEquivalent: { $0 == $1 }) {
    print("foo") // Works
}

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多