从Array中删除对象,传递协议

时间:2016-03-02 08:43:24

标签: ios arrays swift

我有一个名为IdeaListener的协议,以及一个扩展此协议的元素数组。

private var ideaListeners: [IdeaListener]

我想创建一个扩展,以便在给定IdeaProtocol实例的情况下从数组中删除对象。

var myInstanceOfIdeaListener: IdeaListener
...
ideaListeners.removeObject(myInstanceOfIdeaListener)

我在网上找到了很多解决方案,但没有一个能够接受协议作为removeObject函数的参数。 为了实现这个目标,我写了这个扩展名:

extension Array {

   mutating func removeObject(object: AnyObject) -> Element? {

    for (index, objectToCompare) in self.enumerate() {
        if let to = objectToCompare as? AnyObject where to == object {
            return removeAtIndex(index)
        }
    }
    return nil
  }
}

但是编译器说

  

二元运算符' =='无法应用于两个AnyObject'操作数。

为什么我不能使用==来比较两个AnyObject?您如何检查数组是否包含object

此外,我想改进这个功能,在开头添加一个类型检查,以检查object的类型是否实际上是数组中元素的类型。我不知道如何编码这个概念。像这样:

guard object is /*type of elements in array*/ else {
     return nil
}

如何获取数组中元素的类型?

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情

    let a = ObjectOfProtocol()
    let b = ObjectNotOfProtocol()
    let c = [a,b]

    let d = c.filter { (x:AnyObject) -> Bool in

        return !x.conformsToProtocol(Protocol);
    }

    print("filtered array: \(d)") //should only show [ObjectNotOfProtocol]

这将删除符合数组<{p>}中Protocol的所有对象

所以不要进行扩展,只需使用此过滤器

即可

甚至可以将其添加为method extension to the Protocol itself,因此您可以使用类似Protocol.filterFromArray(数组)的内容,如果您希望它只是一个,它将返回包含协议的所有对象的数组方法调用,每次都没有写出过滤器