IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> swift 对存储遵循某个协议的数组的增删操作 -> 正文阅读

[移动开发]swift 对存储遵循某个协议的数组的增删操作

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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:46:08  更:2022-10-17 12:48:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 20:52:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码