gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:45:05 25 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?进行讨论在苹果开发者论坛中。这一变化随着实现的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/35055866/

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