扩展Swift数组以复制indexOfObject函数

时间:2014-06-19 17:33:53

标签: ios objective-c swift

我一直在尝试从Big Nerd Ranch的最新iOS书中实现Swift中的iOS应用程序。

在指南中,有以下方法,其中privateItems是NSMutableArray

- (void)removeItem:(BNRItem *)item
{
    [self.privateItems removeObjectIdenticalTo:item]
}

所以在我的Swift实现中,将privateItems作为Swift数组,我希望能够做到这一点:

func removeItem(item: Item) {
    _privateItems.removeObjectIndenticalTo(item)
}

但是,Swift Array不支持该方法。它有removeAtIndex方法。我知道我可以通过以下代码实现相同的效果:

func removeItem(item: Item) {
    for (index, element) in enumerate(_privateItems) {
        if element === item {
            _privateItems.removeAtIndex(index)
        }
    }
}

但是,我想为Swift数组创建一个通用扩展,这样我就不必每次都这样做了。这不是什么大不了的事,但我认为至少对学习来说是好的。

我已经查看了其他几篇SO帖子(How can I extend typed Arrays in Swift?How can we create a generic Array Extension that sums Number types in Swift?),但未能达到我想要的效果。这是我的尝试:

protocol Identifiable {
    func ===(lhs: Self, rhs: Self) -> Self
}

extension Array {
    func removeObjectIndenticalTo<T: Identifiable>(object: T) {
        for (index, element) in enumerate(self) {
            if object === element {
                removeAtIndex(index)
            }
        }
    }
}

我认为我非常接近。这给出了错误“无法找到接受所提供参数的'==='的重载”。我应该做些什么改变呢?

另外作为参考,还有另一个SO帖子用以下方式用一些NSMutableArray方法扩展Swift数组:

extension Array {
    func contains(#object:AnyObject) -> Bool {
        return self.bridgeToObjectiveC().containsObject(object)
    }
    func indexOf(#object:AnyObject) -> Int {
        return self.bridgeToObjectiveC().indexOfObject(object)
    }
}

1 个答案:

答案 0 :(得分:1)

protocol Identifiable {
    @infix func ===(a: Self, b: Self) -> Bool
}

struct Item : Identifiable {
    var n : Int
}

@infix func ===(a: Item, b: Item) -> Bool {
    return a.n == b.n
}
var _privateItems = [Item(n:1),Item(n:2),Item(n:2),Item(n:1),Item(n:2)]
func removeItem(item: Item) {
    var tbr : Int[] = []
    for (index, element) in enumerate(_privateItems) {
        if element === item {
            tbr += index
        }
    }
    for i in reverse(sort(tbr)) {
        _privateItems.removeAtIndex(i)
    }
}
removeItem(Item(n:2))

println(_privateItems.count)
removeItem(Item(n:1))
println(_privateItems.count)