如何在Swift中共享一个Dictionary实例?

时间:2014-06-03 20:05:15

标签: swift dictionary

根据Swift编程语言参考,只要将字典实例传递给函数/方法或分配给常量或变量,它们就会被复制。这似乎效率低下。有没有办法在两种方法之间有效地共享字典的内容而不复制?

5 个答案:

答案 0 :(得分:17)

文档说的确如此,但也有各种说明说它不会影响性能。只有在需要时才会懒惰地进行复制。

  

以下描述涉及数组,字典,字符串和其他值的“复制”。在提到复制的地方,您在代码中看到的行为将始终如同副本一样。但是,当绝对必要时,Swift仅在幕后执行实际复制。 Swift管理所有值复制以确保最佳性能,您不应该避免分配以尝试抢占此优化。

来源:Classes & Collections

含义 - 在实际遇到性能问题之前不要尝试优化!

另外,不要忘记字典是结构。将它们传递给函数时,它们是隐式不可变的,因此不需要复制。要将可变字典实际传递给函数,可以使用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中的“通过引用传递”。这是我得到的:

  1. 众所周知,struct是通过副本传递的,类是通过的 参考
  2. 我引用“将struct包裹在class中非常容易。 指向GoZoner的回答。
  3. 即使复制了struct,也会定义任何classes 结构仍将通过引用传递。
  4. 如果您想在结构上通过引用进行传统传递,请使用 inout。但他特别提到“考虑加入 在说这个时,使用另一个返回值,而不是使用inout
  5. 由于DictionaryKeyTypeValueType定义为泛型:

    struct Dictionary<KeyType : Hashable, ValueType>
    

    我相信这意味着,如果您的KeyTypeValueType是类对象,则在复制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)

相信语言设计者:编译器通常比优化副本更聪明。

你可以解决这个问题,但在证明效率低下之前,我并没有坦率地看到需要。