我正在尝试编写一个简单的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
,即它们不必与==
。
这意味着您不能为所有可能的数组编写该函数。而且Swift不允许您仅扩展Arrays的子集。
这意味着您应该将其作为一个单独的函数编写(这也可能就是为什么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
使用相同的语法添加的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句