带有弱引用键的Swift字典?

时间:2015-11-23 00:39:58

标签: swift dictionary weak

假设我有一些表示网络连接的对象。断开这些连接后,关联的对象将消失。我不想挂起一个不再连接的连接对象。

我还想使用字典将一些数据与这些连接相关联。所以我可能有代码:

class Connection { ... }
class Metadata { ... }

var metadata: [Connection: Metadata] = [:]

但是上面的代码意味着字典将保留对我不想要的Connection对象的引用。当Connection对象消失时,我宁愿自动删除关联的条目。

所以我试过了:

var metadata: [weak Connection: Metadata] = [:]

但这不起作用。对此有什么好的替代解决方案?

2 个答案:

答案 0 :(得分:18)

您正在描述NSMapTable。它给你一个类似字典的东西,对它的键和/或值有弱引用。

答案 1 :(得分:2)

您可以像在How do I declare an array of weak references in Swift?中那样为弱引用编写泛型类型因为您正在为字典键执行此操作,所以您必须完成一些额外的工作才能使其符合Hashable,但它可以做到。

但就个人而言,我不会将连接对象用作关键字。我使用网络请求的唯一字符串标识符作为密钥(例如NSURLSessionTask的{​​{3}})。

这解决了该集合对该请求的强烈引用的关注。

关于在任务完成时删除项目,我只是将这个清理部分作为任务完成逻辑。