【问题标题】:Why is Equatable not defined for optional arrays为什么没有为可选数组定义 Equatable
【发布时间】:2015-10-20 18:48:52
【问题描述】:

谁能给我一个很好的理由说明为什么这不起作用:

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

这将是我提出的(如果不优雅的话)解决方案。但这是微不足道的,所以我觉得我错过了一个没有实施的充分理由。

func ==<T: Equatable>(lhs: [T]?, rhs: [T]?) -> Bool {

    if let lhs = lhs, let rhs = rhs {
        return lhs == rhs
    }
    else if let _ = lhs {
        return false
    }
    else if let _ = rhs {
        return false
    }

    return true
}

【问题讨论】:

  • 实际上可选值是枚举:'enum OptionalValue { case None case Some(T) }' 可以是 'None' 或您的类型,当您将值与可选数组相等时,它会返回类型不相等的情况 None 在第二个 erray 的情况下返回,而不是 stial 没有类型。事实上,当你做'a == b'时它是不同的类型
  • 问题已在 Swift 4.1 中解决

标签: swift swift2


【解决方案1】:

更新: 条件一致性已在 Swift 4.1 中实现。 Equatable 元素的数组和可选项本身就是 Equatable 现在,还有你的代码

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

在 Xcode 9.3 中按预期编译和工作。解决方法不是 不再需要了。


(旧答案:) 仅当底层包装类型是可相等的时,才可以比较可选项:

public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

现在数组可以比较如果元素类型是相等的:

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

但即使对于可等式类型TArray&lt;T&gt; 也不符合Equatable 协议。

目前,这在 Swift 中是不可能的,例如 Why can't I make Array conform to Equatable? 讨论 在 Apple 开发者论坛中。这种变化随着实施 SE-0143 Conditional conformances 在 Swift 4 中。

您的实现看起来是正确的,这可能是一个不同的实现 使用带有模式匹配的 switch/case:

func ==<T: Equatable>(lhs: [T]?, rhs: [T]?) -> Bool {

    switch (lhs, rhs) {
    case let (l?, r?) : // shortcut for (.Some(l), .Some(r))
        return l == r
    case (.None, .None):
        return true
    default:
        return false
    }
}

【讨论】:

  • 啊,我明白了,我之前没有意识到我可以使用非可选 Arrays 这样做的原因仅仅是因为全局函数声明而不是 Array 的扩展以符合到Equatable,其中元素为Equatable。您如何看待我提出的解决方案以及为什么 Apple 不包含该全局功能?
  • @ScottH:查看更新。我只能推测你的最后一个问题,但如果你为数组实现它,那么字典、集合、序列……呢?
  • 这是很多 DRY,这是一个有效的观点。尽管这将遵循与 Apple 选择的相同模式,即为非可选数组提供 ==。在我们可以做类似extension CollectionType : Equatable where Element : Equatable { ... } 的事情之前,这似乎是最好的选择。
  • @ScottH:我建议的运算符实现不起作用(无限递归:),因此我再次将其从答案中删除。
  • 是的,我在最初尝试实施时遇到了同样的问题,这就是我决定采用我不优雅的解决方案的方式。 :)
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2020-01-01
  • 2013-08-16
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多