Swift 带有弱引用键的字典?

Swift dictionary with weak reference keys?

假设我有一些代表网络连接的对象。一旦这些连接断开,关联的对象就会消失。我不想挂在不再连接的连接对象上。

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

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

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

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

所以我尝试了:

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

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

您正在描述一个 NSMapTable。它给你一个类似字典的东西,对其键 and/or 值的引用很弱。

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

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

这解决了集合维护对请求的强引用的问题。

关于任务完成后物品的移除,我只是将清理作为任务完成逻辑的一部分。