[英]Array extension generic Equatable - “Cannot invoke '==' with …”
我正在尝试编写Swift数组的扩展,但是在尝试编译时遇到了一些奇怪的错误。
我的代码:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
for elt in self
{
if elt == item
{
return true
}
}
return false
}
}
错误:
无法使用类型为((T,T)'的参数列表调用'=='
我为什么得到这个? 我正在使用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
}
}
我收到一个有趣的错误的地方:
“ T”与“ T”不同
我想念什么? 我已经阅读了Apple文档,但是我已经在使用Equatable
协议来在'T'
上使用==
运算符。
使用Swift 3.0(我认为有些更高的2.x版本)可以通过使用where
子句引用关联的Element
类型来解决:
extension Array where Element: Equatable
{
func itemExists(item: Element) -> Bool
{
for elt in self
{
if elt == item
{
return true
}
}
return false
}
}
我找到了解决方案。
正如MartinR alreary所说,我的方法仅适用于Equatable元素数组,并且您不能在对模板有更多限制的通用类型上编写方法。
有两种方法-将我的代码作为函数而不是扩展来编写,或者使用此技巧:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
return self.filter({$0 as? T == item}).count > 0
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.