Swift元组不是Equatable,而作为复合类型,它们不能通过协议扩展来制作Equatable.解决方法(如另一个答案中所述)是==为每个元组元素为操作符创建重载.
有趣的是,可以将==运算符声明为常规元组,并使用它来将元组与命名字段进行比较:
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"
Run Code Online (Sandbox Code Playgroud)
元组数组也需要自定义重载作为整体进行比较:
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"
Run Code Online (Sandbox Code Playgroud)
但是,此运算符不接受命名元组的数组:
let namedarray12: [NamedTuple2] = [namedone, namedtwo]
let namedarray3: [NamedTuple2] = [array3[0]]
print(namedarray12 == namedarray3)
// error: binary operator '==' cannot be applied to two '[NamedTuple2]' operands
Run Code Online (Sandbox Code Playgroud)
有没有办法测试命名元组数组的相等性,而不声明==特定命名元组的重载?
Jay*_*ske 11
该方法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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1561 次 |
| 最近记录: |