【发布时间】:2021-12-14 04:57:25
【问题描述】:
在将旧项目从 Objective-C 转换为 Swift 时,我大多能够使用 Dictionary 代替 NSMutableDictionary。但在某些情况下,按值复制字典会很麻烦或使用大量额外内存。
我想我可以简单地将一些 Dictionary 集合更改为 NSMutableDictionary 以使它们成为按值复制的对象,但我看不到指定键和值类型的方法。这适用于 Objective-C:
NSMutableDictionary<NSString*, NSString*> *dict = [NSMutableDictionary dictionary];
但这会在 Swift 中给出错误“无法专门化非泛型类型 'NSMutableDictionary'”:
let dict: NSMutableDictionary<String, String> = [:]
有没有办法指定类型,这样我就不必不断地转换从字典中得到的值?
或者,是否有另一种集合对象支持键和值类型,如Dictionary,但通过引用复制,如NSMutableDictionary?
更新
我尝试按照下面评论中的建议使用NSMapTable。这缺少NSDictionary 的一些功能(例如,它不符合IteratorProtocol),所以我创建了一个子类来尝试替换Dictionary。然后我遇到了使我的子类泛型的问题,因为 Swift 和 Objective-C 对此有不同的支持。
因为这要么需要大量转换(或者为我想要存储在字典中的每种类型的数据创建一个不同的子类),因此我尝试只使用 NSMutableDictionary 并在我读取它们时转换所有值。不幸的是,经过所有这些工作,与使用 Dictionary 相比,我看不出内存使用有任何差异。
所以我想拥有按值复制的集合并不是我的问题。这不应该是因为我从来没有保留任何东西很长时间,但是直到我从 Objective-C 迁移之前我没有看到这些内存问题。我将不得不进行更多测试并探索其他解决方案。
【问题讨论】:
-
不完全是'通过引用复制,但NSMapTable 可以持有弱引用。这是来自NSHipster的更多信息
标签: ios swift dictionary collections