gpt4 book ai didi

Swift - 检测项目是否被插入到 NSMutableSet

转载 作者:行者123 更新时间:2023-11-28 06:13:09 26 4
gpt4 key购买 nike

这更多的是为了兴趣而不是问题,但是我有一个 NSMutableSet,从 UserDefaults 中检索,我的目标是向它附加一个项目然后写入它后退。我正在使用 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(而不是项目),您会在右侧的输出中获得该集合是否实际更改的指示基于方法调用。

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

最佳答案

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

Set 的 insert 方法实际上返回一个 Bool 表示插入是否成功,你可以在函数签名中看到:变异函数 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函数的返回值,这样写insert不会有编译器警告:

set.insert(1)

关于Swift - 检测项目是否被插入到 NSMutableSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45859017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com