问题 带有弱引用键的Swift字典?


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

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

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

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

但上面的代码意味着字典会保留对引用的引用 Connection 我不想要的物品。我希望删除相关的条目,理想情况下自动删除 Connection 物体消失了。

所以我尝试过:

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

但这不起作用。什么是一个很好的替代解决方案?


6285
2017-11-23 00:39


起源



答案:


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


14
2017-11-23 00:49



好文章在这里: nshipster.com/nshashtable-and-nsmaptable - matt
只是给每个人在服务器上编写Swift的注意事项: NSMapTable 和 NSHashTable Linux上不存在,所以你需要使用Rob的答案。 - Zoyt


答案:


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


14
2017-11-23 00:49



好文章在这里: nshipster.com/nshashtable-and-nsmaptable - matt
只是给每个人在服务器上编写Swift的注意事项: NSMapTable 和 NSHashTable Linux上不存在,所以你需要使用Rob的答案。 - Zoyt


您可以为弱引用编写泛型类型,就像它们一样 如何在Swift中声明一个弱引用数组? 因为您正在为字典键执行此操作,所以您必须完成一些额外的工作才能使其符合 Hashable, 但这是可以完成的。

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

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

关于在任务完成时删除项目,我只是完成任务完成逻辑的清理部分。


2
2017-11-23 06:10