斯威夫特 1.x
array 中的元素不必是Equatable,即它们不能与== 相提并论。
这意味着您不能为所有个可能的数组编写该函数。而且 Swift 不允许你只扩展数组的一个子集。
这意味着你应该把它写成一个单独的函数(这可能就是为什么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/Xcode 7(测试版)更新
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。