Swift中Compare/Equatable弱泛型:弱引用代理数组的清理实现问题
实现Swift弱引用代理数组的两种整理方法
嘿,针对你这个Swift弱引用代理数组的需求,我帮你把两个方法的实现都补全了,直接看代码和细节解释就行:
fileprivate class WeakDelegate<T: AnyObject> { weak var value: T? init(value: T) { self.value = value } } class Radio { private var delegates = [WeakDelegate<AnyObject>]() // 额外加个添加代理的方法,让整个逻辑更完整 func add<T: AnyObject>(delegate: T) { delegates.append(WeakDelegate(value: delegate)) // 每次添加后顺便清理失效代理,保持数组整洁 removeDeadDelegates() } // 1. 移除失效代理的方法实现 func removeDeadDelegates() { // 过滤掉value已被释放(为nil)的代理项,重新赋值给数组 delegates = delegates.filter { $0.value != nil } } // 2. 移除指定代理对象的泛型方法实现 func remove<T: AnyObject>(specificDelegate: T) { // 先清理失效代理,避免无效数据干扰 removeDeadDelegates() // 用恒等运算符===匹配引用类型实例,移除对应的代理项 delegates.removeAll { $0.value === specificDelegate } } }
方法细节说明
removeDeadDelegates:这个方法逻辑很简洁,利用
filter筛选出所有value不为nil的WeakDelegate实例,替换原数组。你可以在添加新代理、触发代理回调前调用它,确保数组里只保留有效的代理对象。remove
(specificDelegate: T) :- 第一步先调用
removeDeadDelegates清理失效项,避免无效数据占用空间; - 然后用
removeAll(where:)方法,通过**恒等运算符===**匹配引用类型的具体实例(注意这里不能用==,因为我们要找的是同一个对象,而不是值相等的对象),把对应的代理项从数组中移除。
- 第一步先调用
另外提个小建议:如果之后需要遍历代理触发回调,可以先调用removeDeadDelegates,再用delegates.compactMap { $0.value }获取所有有效的代理对象,这样遍历的时候就不用额外处理nil了。
内容的提问来源于stack exchange,提问作者Magoo
相关产品推荐
相关产品推荐

