You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:43:19