gpt4 book ai didi

swift - 如何测试命名元组的 Swift 数组的相等性

转载 作者:搜寻专家 更新时间:2023-10-30 22:06:57 25 4
gpt4 key购买 nike

Swift 元组不是 Equatable,作为复合类型,它们不能通过协议(protocol)扩展变成 Equatable。解决方法 ( as documented in another answer ) 是为每个元组元数的 == 运算符创建一个重载。

有趣的是,可以为常规元组声明 == 运算符,并使用它来比较元组与命名字段:

func ==<T1: Equatable, T2: Equatable>(lhs: (T1,T2), rhs: (T1,T2)) -> Bool {
return lhs.0 == rhs.0 && lhs.1 == rhs.1
}

var one = ("One", 1)
let two = ("Two", 2)
print(one == two) // "false"

typealias NamedTuple2 = (name: String, value: Int)
var namedone: NamedTuple2 = (name: "One", value: 1)
let namedtwo: NamedTuple2 = (name: "Two", value: 2)
print(namedone == namedtwo) // "false"
print(namedone == one) // "true"

元组数组也需要自定义重载才能作为一个整体进行比较:

func ==<T0: Equatable, T1: Equatable>(lhs: [(T0, T1)], rhs: [(T0, T1)]) -> Bool {
if lhs.count != rhs.count {
return false
}
for (index, value) in lhs.enumerate() {
if !(value == rhs[index]) {
return false
}
}
return true
}

let array12: [(String, Int)] = [one, two]
let array3: [Tuple2] = [("Three", 3)]
print(array12 == array3) // "false"

但是,此运算符不接受命名元组数组:

let namedarray12: [NamedTuple2] = [namedone, namedtwo]
let namedarray3: [NamedTuple2] = [array3[0]]
print(namedarray12 == namedarray3)
// error: binary operator '==' cannot be applied to two '[NamedTuple2]' operands

有没有一种方法可以测试命名元组数组的相等性,而无需为特定命名元组声明 == 的重载?

最佳答案

SequenceType.elementsEqual(_,isEquivalent:) 方法接受用于比较元素的谓词。相同的 == 重载适用于命名和未命名的元组。因此,与其尝试将 == 应用于整个数组,不如使用 elementsEqual

func ==<T1: Equatable, T2: Equatable>(lhs: (T1,T2), rhs: (T1,T2)) -> Bool {
return lhs.0 == rhs.0 && lhs.1 == rhs.1
}

let namedarray: [(name: String, value: Int)] = [(name: "One", value: 1), (name: "Two", value: 2)]
// namedarray == namedarray12
namedarray.elementsEqual(namedarray12, isEquivalent: ==) // true

关于swift - 如何测试命名元组的 Swift 数组的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32814438/

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