这可能是一个菜鸟问题,但我似乎无法写出类似这样的东西
extension Array where Element == (E1, E2), E1: Equatable, E2: Equatable {
func contains(_ tuple: (E1, E2)) -> Bool {
return contains { $0.0 == tuple.0 && $0.1 == tuple.1 }
}
}
我想要的是扩展由Equatable
值组成的元组数组,以便我可以找出某个元组是否属于该数组。
我可以写一个像这样的免费功能
func inArray<E1: Equatable, E2: Equatable>(_ tuple: (E1, E2), _ array: [(E1, E2)]) -> Bool {
return array.contains { t in t.0 == tuple.0 && t.1 == tuple.1 }
}
,但如果可能的话,我希望将此功能附加到Array
。
另请注意,我有点坚持元组,因此不能使用其他构造(如Equatable
结构/枚举/类来对此进行建模。
答案 0 :(得分:1)
您可以通过约束方法而不是方法来实现 扩展:
extension Array {
func contains<E1, E2>(_ tuple: (E1, E2)) -> Bool where E1: Equatable, E2: Equatable, Element == (E1, E2) {
return contains { $0.0 == tuple.0 && $0.1 == tuple.1 }
}
}
示例:
let a = [(1, "a"), (2, "b")]
print(a.contains((1, "a")))
答案 1 :(得分:1)
extension Array {
func contains<T: Equatable, U: Equatable>(_ tuple: Element) -> Bool where Element == (T, U) {
return contains{tuple.0 == $0.0 && tuple.1 == $0.1}
}
}