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
, 但这是可以做到的。
但就我个人而言,我不会使用连接对象作为键。我使用网络请求的唯一字符串标识符作为密钥(例如 NSURLSessionTask
的 taskIdentifier
)。
这解决了集合维护对请求的强引用的问题。
关于任务完成后物品的移除,我只是将清理作为任务完成逻辑的一部分。
假设我有一些代表网络连接的对象。一旦这些连接断开,关联的对象就会消失。我不想挂在不再连接的连接对象上。
我还想使用字典将一些数据与这些连接相关联。所以我可能有代码:
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
, 但这是可以做到的。
但就我个人而言,我不会使用连接对象作为键。我使用网络请求的唯一字符串标识符作为密钥(例如 NSURLSessionTask
的 taskIdentifier
)。
这解决了集合维护对请求的强引用的问题。
关于任务完成后物品的移除,我只是将清理作为任务完成逻辑的一部分。