我正在尝试为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的新手,所以这就是我的知识耗尽的地方。任何建议都将不胜感激。
答案 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
协议。