2017-08-24 31 views
1

这更多是为了感兴趣而不是问题,但是我有一个NSMutableSet,从UserDefaults中检索到,我的目标是追加一个项目并将其写回。我正在使用NSMutableSet,因为我只想要插入独特的项目。Swift - 检测项目是否插入到NSMutableSet中

要插入的对象的类型是一个自定义类,我已经覆盖了hashCodeisEqual

var stopSet: NSMutableSet = [] 

if let ud = UserDefaults.standard.object(forKey: "favStops") as? Data { 
    stopSet = NSKeyedUnarchiver.unarchiveObject(with: ud) as! NSMutableSet 
} 

stopSet.add(self.theStop!) 

let outData = NSKeyedArchiver.archivedData(withRootObject: stopSet) 
UserDefaults.standard.set(outData, forKey: "favStops") 
NSLog("Saved to UserDefaults") 

我得到的设置,调用mySet.add(obj)然后编写组回UserDefaults。一切似乎都很好,并且(据我所知)似乎没有重复。

但是,是否有可能判断对mySet.add(obj)的调用是否实际上导致将项目写入集合。 mySet.add(obj)没有返回值,如果您使用Playgrounds(而不是项目),则在右侧的输出中显示该集是否实际上是基于方法调用而更改的。

我知道集并不意味着存储重复的对象,所以理论上我应该相信这一点,但我只是想知道该集是否返回了可以访问的响应 - 而不是在插入前获取长度之后如果我真的想知道!

回答

1

Swift有自己的原生类型,Set,所以你应该使用它而不是NSMutableSet

集的insert方法实际上返回表示Bool插入是否成功,您可以在函数签名看到: mutating func insert(_ newMember: Element) -> (inserted: Bool, memberAfterInsert: Element)

下面的测试代码展示了这种行为:

var set = Set<Int>() 
let (inserted, element) = set.insert(0) 
let (again, newElement) = set.insert(0) 

print(inserted,element) //true, 0 
print(again,oldElement) //false,0 

的元组的第二个值在插入成功时返回新插入的元素,否则返回oldElement。 oldElement在每个方面都不一定与您试图插入的元素相同。 (因为对于自定义类型,您可以以不比较类型的每个属性的方式来定义isEqual方法)。

你并不需要处理insert函数的返回值,没有编译器警告,如果你只写插入这样的:

set.insert(1) 
+0

谢谢你,当我在操场玩耍,我使用'Set',它给了我所示方法签名的回应。 由于某种原因,我并不认为'Set'符合'NSCoding',所以这就是为什么我使用桥接变体 - 但它看起来像它(现在?!) – jeonatl3

+0

你是对的,它不符合默认情况下为'NSCoding',但是当Element可以连接到Foundation时或者当Element是一个类时,它可以桥接到NSSet,因为对于你的情况Element是Data类型既是一个类,也可以桥接到'NSData',因此编译器会自动处理它。 –

相关问题