我有一个名为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
}
如何获取数组中元素的类型?
答案 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(数组)的内容,如果您希望它只是一个,它将返回包含协议的所有对象的数组方法调用,每次都没有写出过滤器