我正在尝试编写一个简单的Array扩展,该扩展提供了“ distinct”方法。这是我到目前为止的内容:
extension Array { func distinct() -> T[] { var rtn = T[]() for x in self { var containsItem = contains(rtn, x) if !containsItem { rtn.append(x) } } return rtn } }
问题是“包含”语句失败,如下所示:
找不到包含所提供参数的“包含”的重载
我很确定类型约束是正确的。有任何想法吗?
元素中的元素array不必是Equatable,即它们不必与==。
array
Equatable
==
这意味着您不能为 所有 可能的数组编写该函数。而且Swift不允许您仅扩展Arrays的子集。
这意味着您应该将其作为一个单独的函数编写(这也可能就是为什么contains它都不是方法)的原因。
contains
let array = ["a", "b", "c", "a"] func distinct<T: Equatable>(array: [T]) -> [T] { var rtn = [T]() for x in array { var containsItem = contains(rtn, x) if !containsItem { rtn.append(x) } } return rtn } distinct(array) // ["a", "b", "c"]
Swift 2支持将扩展限制为协议实现的子集,因此现在允许以下操作:
let array = ["a", "b", "c", "a"] extension SequenceType where Generator.Element: Comparable { func distinct() -> [Generator.Element] { var rtn: [Generator.Element] = [] for x in self { if !rtn.contains(x) { rtn.append(x) } } return rtn } } array.distinct() // ["a", "b", "c"]
请注意苹果如何SequenceType.contains使用相同的语法添加的。
SequenceType.contains