如何在Swift中创建一个弱引用集合

7

NSSet保存其对象的强引用,因此Objective C的解决方案是使用NSHashTable.weakObjectsHashTable()。

NSHashTable* mySet = [NSHashTable weakObjectsHashTable];
[mySet addObject:anyOldObject];
[mySet count]; //returns 1
[mySet containsObject:anyOldObject]; //returns true

在Swift中,这似乎行不通。
var mySet = NSHashTable.weakObjectsHashTable()
mySet.addObject(anyOldObject)
mySet.count //returns 1
mySet.containsObject(anyOldObject) //returns false

我错过了什么?还是这个存在漏洞?

你会期望mySet.allObjects也返回一个非空数组吗?因为它似乎并没有。 - Matt Gibson
是的,我把那个留给读者作为练习 :) 我完全不明白 - Hammer
我也不知道。我不能假装对weakObjectsHashTable有很多了解,但它肯定感觉有点buggy。 - Matt Gibson
有趣。在 beta 5 中,allObjects 返回了我所期望的结果,但 containsObject 仍然似乎不起作用。 - Matt Gibson
我曾经遇到过类似的问题,即将一个Swift对象添加到持有弱引用的NSHashTable中。我不得不将这个Swift对象变成NSObject的子类,才能将其添加到哈希表中。 - ribeto
1个回答

1
在使用字符串作为任意对象的情况下,在Xcode6b5上,我能够看到返回true的结果。在6b4中存在一些错误,导致可选值无法在解释器中返回,这意味着它们被积极清除 - 可能是类似这样的问题导致了相同的效果。值得重新尝试一下,看看最新测试版是否有相同的行为。

不知道OP怎么样了,但我在iOS9.0测试版中仍然遇到这些问题。这个该死的东西似乎就是无法保持其内容。 - Ash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接