Ios 扩展Swift数组以复制IndexOfoObject函数
我一直在尝试用Big Nerd Ranch最新的iOS书籍中的Swift实现iOS应用程序 在指南中,有以下方法,其中privateItems是NSMutableArrayIos 扩展Swift数组以复制IndexOfoObject函数,ios,objective-c,swift,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
- (void)removeItem:(BNRItem *)item
{
[self.privateItems removeObjectIdenticalTo:item]
}
因此,在我的Swift实现中,将privateItems作为Swift数组,我希望能够做到这一点:
func removeItem(item: Item) {
_privateItems.removeObjectIndenticalTo(item)
}
但是,Swift数组不支持该方法。它具有removeAtIndex方法。我知道我可以通过以下代码实现同样的效果:
func removeItem(item: Item) {
for (index, element) in enumerate(_privateItems) {
if element === item {
_privateItems.removeAtIndex(index)
}
}
}
但是,我想为Swift数组创建一个通用扩展,这样我就不必每次都这样做了。这没什么大不了的,但我认为这至少对学习有好处
我已经研究了其他几个SO帖子(和),但没有能够实现我想要的。以下是我的尝试:
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)
}
}
}
}
项是结构还是类<代码>=和
==
仅用于引用类型请注意,IndexOfoObject的等效项将使用==运算符。IndexOfoObject对每个对象调用isEqual,相当于==运算符将只匹配相同的事件(指针比较和内容比较),不幸的是Swift不允许为数组定义扩展
extension Array {
func contains(#object:AnyObject) -> Bool {
return self.bridgeToObjectiveC().containsObject(object)
}
func indexOf(#object:AnyObject) -> Int {
return self.bridgeToObjectiveC().indexOfObject(object)
}
}
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)