根据Swift编程语言参考,只要将字典实例传递给函数/方法或分配给常量或变量,它们就会被复制。这似乎效率低下。有没有办法在两种方法之间有效地共享字典的内容而不复制?
答案 0 :(得分:17)
文档说的确如此,但也有各种说明说它不会影响性能。只有在需要时才会懒惰地进行复制。
以下描述涉及数组,字典,字符串和其他值的“复制”。在提到复制的地方,您在代码中看到的行为将始终如同副本一样。但是,当绝对必要时,Swift仅在幕后执行实际复制。 Swift管理所有值复制以确保最佳性能,您不应该避免分配以尝试抢占此优化。
含义 - 在实际遇到性能问题之前不要尝试优化!
另外,不要忘记字典是结构。将它们传递给函数时,它们是隐式不可变的,因此不需要复制。要将可变字典实际传递给函数,可以使用inout
参数,不会复制字典(通过引用传递)。 当您将参数声明为 var
时,将复制作为参数传递的可变字典的唯一情况。
答案 1 :(得分:8)
您始终可以选择使用Dictionary
属性定义自定义通用类:
class SharedDictionary<K, V> {
var dict : Dictionary<K, V>
// add the methods you need, including overloading operators
}
SharedDictionary
的实例将通过引用传递(不复制)。
答案 2 :(得分:7)
我实际上今天和Swift团队的某个人谈过Swift中的“通过引用传递”。这是我得到的:
struct
包裹在class
中非常容易。
指向GoZoner的回答。struct
,也会定义任何classes
结构仍将通过引用传递。inout
。但他特别提到“考虑加入
在说这个时,使用另一个返回值,而不是使用inout
。由于Dictionary
将KeyType
和ValueType
定义为泛型:
struct Dictionary<KeyType : Hashable, ValueType>
我相信这意味着,如果您的KeyType
和ValueType
是类对象,则在复制Dictionary
本身时不会复制它们,您不必担心它太多了。
此外,NSDictionary
课程仍可供使用!
答案 3 :(得分:3)
正如其他人所说&#34;当完全有必要时,Swift只会在幕后执行实际的复制。&#34;所以表现不应该是一个大问题。但是,由于某些其他原因,您可能仍希望通过引用传递字典。在这种情况下,您可以创建一个类似下面的自定义类,并像使用普通字典对象一样使用它:
class SharedDictionary<K : Hashable, V> {
var dict : Dictionary<K, V> = Dictionary()
subscript(key : K) -> V? {
get {
return dict[key]
}
set(newValue) {
dict[key] = newValue
}
}
}
答案 4 :(得分:1)
相信语言设计者:编译器通常比优化副本更聪明。
你可以解决这个问题,但在证明效率低下之前,我并没有坦率地看到需要。