iOS Swift错误:'T'无法转换为'MirrorDisposition'

时间:2014-08-08 22:35:33

标签: swift ios8

我正在尝试为Array类型创建一个扩展方法,以允许从数组中删除项目

extension Array {
    func remove(item: AnyObject) {
        for var i = self.count - 1; i >= 0; i-- {
            if self[i] == item {
                self.removeAtIndex(i)
            }
        }
    }
}

在测试条件if self[i] == item上,我收到以下错误:'T' is not convertible to 'MirrorDisposition'

我尝试了很多不同的东西,其中包括:

  • 使用泛型:remove<T>(item: T)
  • 使用===运算符,该运算符仅提供错误'T' does not conform to protocol 'AnyObject'

我是Swift的新手,所以这就是我的知识耗尽的地方。任何建议都将不胜感激。

5 个答案:

答案 0 :(得分:3)

您收到错误,因为编译器无法保证存储在您阵列中的元素可以与==进行比较。您必须确保包含的类型为Equatable。但是,没有办法将方法添加到比类本身更具限制性的泛型类中。最好将其作为一个函数实现:

func removeItem<T: Equatable>(item: T, var fromArray array: [T]) -> [T] {
    for i in reverse(0 ..< array.count) {
        if array[i] == item {
            array.removeAtIndex(i)
        }
    }
    return array
}

或者您可以将其添加为更通用的扩展名:

extension Array {
    mutating func removeObjectsPassingTest(test: (object: T) -> Bool) {
        for var i : Int = self.count - 1; i >= 0; --i {
            if test(object: self[i]) {
                self.removeAtIndex(i)
            }
        }
    }
}

然后你可以这样做:

var list: [Int] = [1,2,3,2,1]
list.removeObjectsPassingTest({$0 == 2})

答案 1 :(得分:2)

我写这个函数的方式是这样的:

mutating func remove<U where U : Equatable>(item: U) {
    for var i = self.count - 1; i >= 0; i-- {
        if self[i] as U == item {
            self.removeAtIndex(i)
        }
    }
}

请务必使用变异装饰你的功能。

我会使用不同的类型参数U,因为您无法将Array的类型参数更改为Equatable。然后我会尝试将项目转换为U来进行比较。

当然,如果您尝试使用以非等同类型实例化的Array调用此函数,则会失败。

答案 2 :(得分:1)

这不是解决方案,但如果您尝试从数组中删除项目,我就是这样做的:

var numbers = [1, 2, 3, 4, 5] if let possibleIndex = find(numbers, 1) { numbers.removeAtIndex(possibleIndex) }

答案 3 :(得分:0)

我不知道什么是MirrorDispsition,但我认为问题在于你不能总是在Array中等同两个对象,因为它们不能保证是等同的。

编辑:看看tng的解决方案。但它只适用于等值物品。

答案 4 :(得分:0)

错误消息令人困惑。它无法工作的问题是因为Swift编译器无法为Array的元素类型==找到T运算符。为此,T需要符合Equatable协议。