gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:29:53 26 4
gpt4 key购买 nike

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

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
}

最佳答案

更新条件一致性已在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

但即使是可等值类型 T , Array<T> 不符合 Equatable协议(protocol)。

目前,这在 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
}
}

关于swift - 为什么没有为可选数组定义 Equatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33244527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com