如何测试命名元组的Swift数组的相等性
发布时间:2020-12-14 04:45:45 所属栏目:百科 来源:网络整理
导读:Swift元组不是Equatable,而作为复合类型,它们不能通过协议扩展来制作Equatable.解决方法( as documented in another answer)是为每个元组元素的==运算符创建重载. 有趣的是,可以为常规元组声明==运算符,并使用它来将元组与命名字段进行比较: func ==T1: Equ
Swift元组不是Equatable,而作为复合类型,它们不能通过协议扩展来制作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)) -> 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |