无法使用在Swift Array扩展中包含

前端之家收集整理的这篇文章主要介绍了无法使用在Swift Array扩展中包含前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个简单的Array扩展,它提供了一个’distinct’方法.这是我到目前为止
  1. extension Array {
  2. func distinct() -> T[] {
  3. var rtn = T[]()
  4.  
  5. for x in self {
  6. var containsItem = contains(rtn,x)
  7. if !containsItem {
  8. rtn.append(x)
  9. }
  10. }
  11. return rtn
  12. }
  13. }

问题是’包含’语句失败如下:

找不到接受提供的参数的’contains’的重载

我很确定类型约束是正确的.有任何想法吗?

Swift 1.x

数组中的元素不一定是Equable,即它们与==不可比.

这意味着您无法为所有可能的数组写入该函数.而Swift不允许你只扩展一个数组的子集.

这意味着你应该把它写成一个单独的函数(这也许是为什么contains不是一个方法).

  1. let array = ["a","b","c","a"]
  2.  
  3. func distinct<T: Equatable>(array: [T]) -> [T] {
  4. var rtn = [T]()
  5.  
  6. for x in array {
  7. var containsItem = contains(rtn,x)
  8. if !containsItem {
  9. rtn.append(x)
  10. }
  11. }
  12. return rtn
  13. }
  14.  
  15. distinct(array) // ["a","c"]

Swift 2 / Xcode 7(Beta)更新

Swift 2支持将扩展限制到协议实现的一个子集,因此现在允许以下内容

  1. let array = ["a","a"]
  2.  
  3. extension SequenceType where Generator.Element: Comparable {
  4. func distinct() -> [Generator.Element] {
  5. var rtn: [Generator.Element] = []
  6.  
  7. for x in self {
  8. if !rtn.contains(x) {
  9. rtn.append(x)
  10. }
  11. }
  12. return rtn
  13. }
  14. }
  15.  
  16. array.distinct() // ["a","c"]

注意apple如何使用相同的语法添加SequenceType.contains.

猜你在找的Swift相关文章