我一直在尝试从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)
}
}
答案 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)