有人能给我一个很好的理由说明为什么这不起作用:
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
}
答案 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
但即使对于等同类型T
,Array<T>
也不符合<{1}}协议。
目前,这在Swift中是不可能的,例如参见 Why can't I make Array conform to Equatable?进行讨论 在Apple开发者论坛中。这种变化与实施有关 的SE-0143 Conditional conformances 在Swift 4中。
您的实施看起来是正确的,这是一个可能不同的 使用带模式匹配的开关/案例:
Equatable