Swift中没有函数的数组

时间:2014-06-12 02:17:28

标签: generics swift

按照泛型和类型约束的指南,我试图创建一个Array.without函数,如下所示:

extension Array {
  func without<T: Equatable>(item:T) -> T[] {
    return self.map { $0 != item }
  }
}

在游乐场测试这个,我无法让它工作,因为!=值触发编译器错误,“无法找到!=接受提供的参数的重载”。

我认为<T: Equatable>应该足以允许使用!=,但显然它不起作用。这里缺少什么?

1 个答案:

答案 0 :(得分:2)

问题是您在方法中定义的T与实际结构中定义的T无关。您的本地T被限制为Equatable,但Array T版本的self.map仍然没有受到约束,这就是Array为关闭提供的内容。关闭时会收到T类型T,您正在尝试将其与您当地的extension Array { func without<U : Equatable>(item : U) -> [T] { return self.filter { $0 as? U != item } } } 进行比较,而filter不一定是同一类型。

我认为你能做的最好的事情就是这样:

map

不幸的是,如果使用存储在数组中的不同类型的实例调用它,它仍然可以工作。如果这样做,它将只返回原始数组。它不会让你用一个不相同的实例来调用它。

备注:

  1. 我使用map代替without,因为这是允许您过滤掉数组内容的方法。 filter用于更改内容
  2. 我更改了map以返回数组。 {{1}}和{{1}}不修改数组,而是返回根据闭包更改的数组的新版本。