比较Array扩展中的对象导致Swift中的错误

时间:2014-06-04 06:09:52

标签: swift

我试图构建一个扩展,将NSArray / NSMutableArray的一些便利功能添加到Swift Array类中,我试图添加此功能:

func indexOfObject(object:AnyObject) -> Int? {

    if self.count > 0 {
        for (idx, objectToCompare) in enumerate(self) {
            if object == objectToCompare {
                return idx
            }
        }
    }

    return nil
}

但不幸的是,这一行:

if object == objectToCompare {

给出错误:

  

无法找到' =='接受提供的参数

问题

导致此错误的错误是什么?

示例

extension Array {

    func indexOfObject(object:AnyObject) -> Int? {

        if self.count > 0 {
            for (idx, objectToCompare) in enumerate(self) {
                if object == objectToCompare {
                    return idx
                }
            }
        }

        return nil
    }

} 

6 个答案:

答案 0 :(得分:7)

实际上没有必要实施indexOfObject:;已经有一个全局函数find(array, element)

答案 1 :(得分:6)

您始终可以创建使用NSArray的indexOfObject的扩展名,例如:

extension Array {
    func indexOfObject(object:AnyObject) -> Int? {
        return (self as NSArray).indexOfObject(object)
    }
}

您可以指定可以将数组项与<T : Equatable>约束进行比较,然后将对象转换为T并进行比较,例如:

extension Array {
    func indexOfObject<T : Equatable>(o:T) -> Int? {
        if self.count > 0 {
            for (idx, objectToCompare) in enumerate(self) {
                let to = objectToCompare as T
                if o == to {
                    return idx
                }
            }
        }

        return nil
    }
}

答案 2 :(得分:2)

我的猜测是你必须做这样的事情:

func indexOfObject<T: Equatable>(object: T) -> Int? {

等等。

答案 3 :(得分:0)

以下是Apple&#34; The Swift Programming Language&#34;的相关示例。在&#34;泛型&#34;部分:

func findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? {
    for (index, value) in enumerate(array) {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

这里的关键想法是,valuevalueToFind必须属于保证实现/重载==运算符的类型。 <T: Equatable>是一个泛型,它只允许类型的对象很好,等同。

在您的情况下,我们需要确保数组本身仅由等同的对象组成。 Array被声明为具有通用<T>的结构,但不要求它是等同的。我不知道是否可以使用扩展来更改数组可以组成的类型。我已经尝试了一些语法变化,但没有找到方法。

答案 4 :(得分:0)

您可以将比较部分提取到另一个辅助函数,例如

extension Array {
    func indexOfObject(object: T, equal: (T, T) -> Bool) -> Int? {

        if self.count > 0 {
            for (idx, objectToCompare) in enumerate(self) {
                if equal(object, objectToCompare) {
                    return idx
                }
            }
        }

        return nil
    }
}

let arr = [1, 2, 3]

arr.indexOfObject(3, ==) // which returns {Some 2}

答案 5 :(得分:0)

你很亲密。这是一个有效的扩展:

extension Array {
    func indexOfObject<T: Equatable>(object:T) -> Int? {
        if self.count > 0 {
            for (idx, objectToCompare) in enumerate(self) {
                if object == objectToCompare as T {
                    return idx
                }
            }
        }
        return nil
    }
}

Swift无法知道 object objectToCompare 是否相等。通过向方法添加通用信息,我们就可以开展业务了。