繁体   English   中英

数组扩展通用Equatable-“无法使用…调用'=='

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM