数组扩展通用Equatable - "无法调用' =='与..."

时间:2015-05-19 07:49:58

标签: ios arrays swift generics

我正在尝试编写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'运算符。

2 个答案:

答案 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
    }
}