Ios 数组扩展通用等式-“;无法调用'==';与……一起;

Ios 数组扩展通用等式-“;无法调用'==';与……一起;,ios,arrays,swift,generics,Ios,Arrays,Swift,Generics,我试图编写Swift数组的扩展,但在编译时遇到了一些wierd错误 我的代码: extension Array { func itemExists<T: Equatable>(item: T) -> Bool { for elt in self { if elt == item { return true } }

我试图编写Swift数组的扩展,但在编译时遇到了一些wierd错误

我的代码:

extension Array
{
    func itemExists<T: Equatable>(item: T) -> Bool
    {
        for elt in self
        {
            if elt == item
            {
                return true
            }
        }
        return false
    }
}
在那里我遇到了一个有趣的错误:

extension Array
{
    func itemExists<T: Equatable>(item: T) -> Bool
    {
        for elt in self
        {
            if elt == item
            {
                return true
            }
        }
        return false
    }
}
“T”与“T”不相同

我错过了什么?我阅读了苹果的文档,但是我已经使用了
equalable
协议,能够在
'T'
上使用
=
操作符,我找到了我的解决方案

正如MartinR Alriery所说,我的方法只适用于可等式元素的数组,并且不能在对模板更严格的泛型类型上编写方法

有两种方法-将代码作为函数而不是扩展编写,或者使用以下技巧:

extension Array
{
    func itemExists<T: Equatable>(item: T) -> Bool
    {
        return self.filter({$0 as? T == item}).count > 0
    }
}
扩展数组
{
func itemExists(item:T)->Bool
{
返回self.filter({$0 as?T==item}).count>0
}
}
对于Swift 3.0(我认为是后来的一些2.x版本),您可以通过使用
where
子句引用关联的类型
元素来解决这个问题:

extension Array where Element: Equatable
{
    func itemExists(item: Element) -> Bool
    {
        for elt in self
        {
            if elt == item
            {
                return true
            }
        }
        return false
    }
}

您是否必须使数组扩展的项也符合equalable:
扩展数组
?您的方法将仅适用于equalable元素的数组,并且您不能在对模板更严格的泛型类型上编写方法。比较或其中一个应该符合“重复”的条件。谢谢@MartinR,我在那里找到了我的答案和错误。你知道Swift已经有了
contains()
函数吗?请参阅。这应该是自Swift 4.2起接受的答案。谢谢您的帮助-我忘了您可以在扩展中使用
元素
作为约束类型。