按照泛型和类型约束的指南,我试图创建一个Array.without函数,如下所示:
extension Array {
func without<T: Equatable>(item:T) -> T[] {
return self.map { $0 != item }
}
}
在游乐场测试这个,我无法让它工作,因为!=值触发编译器错误,“无法找到!=接受提供的参数的重载”。
我认为<T: Equatable>
应该足以允许使用!=
,但显然它不起作用。这里缺少什么?
答案 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
不幸的是,如果使用存储在数组中的不同类型的实例调用它,它仍然可以工作。如果这样做,它将只返回原始数组。它不会让你用一个不相同的实例来调用它。
备注:强>
map
代替without
,因为这是允许您过滤掉数组内容的方法。 filter
用于更改内容map
以返回数组。 {{1}}和{{1}}不修改数组,而是返回根据闭包更改的数组的新版本。