?swift中对协议的操作是非常多的,有时候我们需要把方法接收到的遵循某个协议的对象存储下来,然后在其他地方调用,该情况在实现通知操作时候比较常见。
有两种方式可以选择,
第一种方式是接收任意对象,然后去判断该对象是否遵循了某个协议,以删除为例,代码如下
public func removeVideoPlayEventListener(_ listener: Any) {
self.mCommonVideoPlayEventListeners.removeAll { it in
if listener is 协议名{ return true}
}
}
对象 is 协议名,就是判断该对象是否遵循了某个协议
但这种有个弊端,就是调用该方法的人并不清楚需要遵循什么协议,对使用的人很不友好。
第二种是我更喜欢用的
就是在接受的时候就只接受某个遵循特定协议的对象 添加操作 代码如下:
public func addVideoPlayEventListener(_ listener: ICommonVideoPlayEventListener) {
self.mCommonVideoPlayEventListeners.append(listener)
}
ICommonVideoPlayEventListener是我的协议名,mCommonVideoPlayEventListeners是数组,append是添加数据到该数组的末尾
但是删除的时候要注意一下,不能直接进行布尔值判断
public func removeVideoPlayEventListener(_ listener: ICommonVideoPlayEventListener) {
self.mCommonVideoPlayEventListeners.removeAll { it in
return it == listener
}
}
这时候的it 和 listener都是协议,是无法用 == 来判断两个值是否相同的,报错信息如下
Protocol 'ICommonVideoPlayEventListener' as a type cannot conform to 'Equatable'
因此,这里需要进行一下强转,将协议转换成对象,然后在进行判断,代码如下:
public func removeVideoPlayEventListener(_ listener: ICommonVideoPlayEventListener) {
self.mCommonVideoPlayEventListeners.removeAll { it in
let listenerObj = listener as! NSObject
let itObj = it as! NSObject
return itObj == listenerObj
}
}
还有一点需要注意,这里只能强转成nsobject,转成any或者anyobject仍然是不行的
|