gpt4 book ai didi

swift - 更新字典 Swift

转载 作者:可可西里 更新时间:2023-11-01 01:35:00 24 4
gpt4 key购买 nike

我有一个行为问题,我有一本字典 [String:AnyObject]我想实现一个更新方法,所以我使用

 otherDictionary.forEach { thisDictionary.updateValue($1, forKey: $0) }

但我想知道 AnyObject 的更新是否只是删除旧值并替换为新值,或者是否浏览可能在 AnyObject 后面的整个图(例如复杂对象)如果有人知道答案,那就太棒了!

最佳答案

由于 AnyObject 存储了对 class 实例的引用,因此作为字典值存储的只是指向类实例的引用计数指针类。

当您调用 let oldObject = thisDictionary.updateValue(newObject, forKey: foo) 时,updateValue 会将字典中的引用替换为您传递的引用in,并返回之前保存的对象。

在您的情况下,您没有捕获该返回值,因此 Swift(使用 ARC:自动引用计数)将递减对旧对象的引用,如果这是您的最后一个引用应用程序,它将释放该对象。

由于被更新的值是引用,您对原始字典中的对象实例所做的任何更改也会在新字典中看到,反之亦然,因为它们只是对内存中同一对象的两个引用。


例子

考虑这个创建 Person 对象字典的例子:

class Person: CustomStringConvertible {
var name: String
var age: Int
var description: String { return "\(name)-\(age)" }

init(name: String, age: Int) {
self.name = name
self.age = age
}

deinit {
print("\(self) was freed")
}
}

var otherDictionary: [String: AnyObject] = ["Fred": Person(name: "Fred", age: 25), "Wilma": Person(name: "Wilma", age: 24)]

var thisDictionary: [String: AnyObject] = ["Wilma": Person(name: "Smith", age: 86), "Barney": Person(name: "Barney", age: 26)]

otherDictionary.forEach { thisDictionary.updateValue($1, forKey: $0) }

print(thisDictionary)
print(otherDictionary)

(otherDictionary["Fred"] as? Person)?.age = 45
(thisDictionary["Wilma"] as? Person)?.name = "Flintstone"

print(thisDictionary)
print(otherDictionary)

输出:

Smith-86 was freed
["Wilma": Wilma-24, "Barney": Barney-26, "Fred": Fred-25]
["Wilma": Wilma-24, "Fred": Fred-25]
["Wilma": Flintstone-24, "Barney": Barney-26, "Fred": Fred-45]
["Wilma": Flintstone-24, "Fred": Fred-45]

在输出的第 1 行中,我们看到 Person(name: "Smith", age: 86)Wilma 键中替换对象时被释放在 thisDictionary 中。

在输出的第 4 行和第 5 行中,我们看到 "Wilma""Fred" 在两个字典中都已更新,因为每个字典都引用相同的对象.


注意:由于您没有捕获 updateValue(_:forKey:) 返回的值,因此您可以将代码编写为:

otherDictionary.forEach { thisDictionary[$0] = $1) }

关于swift - 更新字典 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38523264/

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