为什么没有为可选数组定义Equatable

时间:2015-10-20 18:48:52

标签: swift swift2

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

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
}

1 个答案:

答案 0 :(得分:18)

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

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

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

(旧答案:) 仅当底层包装类型相等时,才能比较Optionals:

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<T> 也不符合<{1}}协议

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

您的实施看起来是正确的,这是一个可能不同的 使用带模式匹配的开关/案例:

Equatable