我正在尝试编写一个简单的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 } }
问题是’包含’语句失败如下:
找不到接受提供的参数的’contains’的重载
我很确定类型约束是正确的.有任何想法吗?
Swift 1.x
数组中的元素不一定是Equable,即它们与==不可比.
这意味着您无法为所有可能的数组写入该函数.而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","c"]
Swift 2 / Xcode 7(Beta)更新
Swift 2支持将扩展限制到协议实现的一个子集,因此现在允许以下内容:
let array = ["a","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","c"]
注意apple如何使用相同的语法添加SequenceType.contains.