Swift,Equatable 协议错误?

Posted

技术标签:

【中文标题】Swift,Equatable 协议错误?【英文标题】:Swift, Equatable protocol bug? 【发布时间】: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?]? 【参考方案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

【讨论】:

以上是关于Swift,Equatable 协议错误?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 具有实现通用协议的值的 Typealias 字典

来自 equatable 协议的 func == 不适用于自定义对象,swift

Swift 5:在使用协议实现 Equatable 的结构上实现通用数组操作

Swift 3:如何编写 Equatable 函数

iOS开发-Swift进阶之可选类型Optional & Equatable+Comparable协议!

Swift的Equatable和Comparable的使用