加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:20:18 所属栏目:百科 来源:网络整理
导读:我正在尝试编写一个简单的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扩展,它提供了一个’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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读