我正在尝试编写Swift数组的扩展,但在尝试编译时遇到了一些奇怪的错误。
我的代码:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
for elt in self
{
if elt == item
{
return true
}
}
return false
}
}
错误:
无法调用&#39; ==&#39;使用类型&#39;(T,T)&#39;
的参数列表
为什么我会这样?我使用Equatable
协议?
我也尝试过:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
var array:[T] = self
for elt in array
{
if elt == item
{
return true
}
}
return false
}
}
我遇到了一个有趣的错误:
&#39; T&#39;与&#39; <&#39;
不同
我错过了什么?我阅读了有关它的Apple文档,但我已使用Equatable
协议在==
上使用'T'
运算符。
答案 0 :(得分:2)
使用Swift 3.0(我想一些后来的2.x版本),您可以通过引用带有Element
子句的关联类型where
来解决此问题:
extension Array where Element: Equatable
{
func itemExists(item: Element) -> Bool
{
for elt in self
{
if elt == item
{
return true
}
}
return false
}
}
答案 1 :(得分:1)
我找到了解决方案。
正如MartinR alreary所说,我的方法只适用于Equatable元素的数组,并且你不能在对模板更具限制性的泛型类型上编写方法。
有两种方法 - 将我的代码编写为函数而不是扩展,或使用此技巧:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
return self.filter({$0 as? T == item}).count > 0
}
}