ios - 数组扩展通用 Equatable - "Cannot invoke ' = =' with ..."

标签 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
    }
}

错误:

Cannot invoke '==' with an argument list of type '(T, T)'

为什么我会得到这个?我正在使用 Equatable 协议(protocol)?

我还尝试过的是:

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' is not identical to 'T'

我错过了什么?我阅读了有关它的 Apple 文档,但我已经在使用 Equatable 协议(protocol),以便能够在 '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
    }
}

关于ios - 数组扩展通用 Equatable - "Cannot invoke ' = =' with ...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319700/

相关文章:

ios - 如何设置选中的TableView的一些索引

ios - 如何禁用调度源计时器的第一次触发

ios - 多个后台线程对主线程的调用可以同时发生吗?

python - 将 numpy.array a 中的每个元素与 numpy.array b 中的每个元素相乘

ios - Swift 3 Date 类型不作为自定义类的一部分进行编码

ios - swift 3 : Realm creates additional object instead of updating the exisiting one

ios - 在 C 包装器中获取 Objective-C 值(Unity 插件)

ios - 根据用户决定取消选中开关

python - 在Python中将一维数组转换为基于类的二维矩阵

php - 使用 MySqli 和数组返回多行