假设我有一些表示网络连接的对象。断开这些连接后,关联的对象将消失。我不想挂起一个不再连接的连接对象。
我还想使用字典将一些数据与这些连接相关联。所以我可能有代码:
class Connection { ... }
class Metadata { ... }
var metadata: [Connection: Metadata] = [:]
但是上面的代码意味着字典将保留对我不想要的Connection
对象的引用。当Connection
对象消失时,我宁愿自动删除关联的条目。
所以我试过了:
var metadata: [weak Connection: Metadata] = [:]
但这不起作用。对此有什么好的替代解决方案?
答案 0 :(得分:18)
您正在描述NSMapTable。它给你一个类似字典的东西,对它的键和/或值有弱引用。
答案 1 :(得分:2)
您可以像在How do I declare an array of weak references in Swift?中那样为弱引用编写泛型类型因为您正在为字典键执行此操作,所以您必须完成一些额外的工作才能使其符合Hashable
,但它可以做到。
但就个人而言,我不会将连接对象用作关键字。我使用网络请求的唯一字符串标识符作为密钥(例如NSURLSessionTask
的{{3}})。
这解决了该集合对该请求的强烈引用的关注。
关于在任务完成时删除项目,我只是将这个清理部分作为任务完成逻辑。