gpt4 book ai didi

swift - 比较可选数组

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

在 playground 中运行以下代码片段会报错:

let a: [Int]? = [1,2]
let b: [Int]? = [1,2]
a == b // value of optional type '[Int]?' not unwrapped; did you mean to use '!' or '?'?

虽然为“更简单”的可选类型做类似的事情:

var x: Int? = 10
var y: Int?
x == y // false

第一种情况不允许使用可选数组的原因是什么?为什么 Swift 不能首先查看是否有任何一方 if nil (.None),如果不是,则进行实际的数组比较。

最佳答案

它适用于更简单类型的原因是因为有一个版本的 == 是为包含 Equatable 类型的可选类型定义的:

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

但是虽然 IntEquatable,但 Array 不是(因为它可能包含一些不可等式的东西 - 在这种情况下它怎么可能是)。所有 Equatable 事物都有一个 == 运算符,但并非所有具有 == 运算符的事物都是 Equatable

您可以编写一个特殊版本的 == 专门用于包含可等式类型的可选数组:

func ==<T: Equatable>(lhs: [T]?, rhs: [T]?) -> Bool {
switch (lhs,rhs) {
case (.Some(let lhs), .Some(let rhs)):
return lhs == rhs
case (.None, .None):
return true
default:
return false
}
}

您还可以将其概括为涵盖任何包含可等式元素的集合:

func ==<C: CollectionType where C.Generator.Element: Equatable>
(lhs: C?, rhs: C?) -> Bool {
switch (lhs,rhs) {
case (.Some(let lhs), .Some(let rhs)):
return lhs == rhs
case (.None, .None):
return true
default:
return false
}
}

关于swift - 比较可选数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29478665/

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