swift 对存储遵循某个协议的数组的增删操作

3 篇文章 0 订阅
1 篇文章 0 订阅

 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仍然是不行的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值