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

Gre*_*own 15 dictionary swift

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

Sul*_*han 17

文档说这是真的,但也有各种说明它不会影响性能.复制将在懒惰的情况下执行 - 仅在需要时进行.

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

来源:课程和收藏

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

另外,不要忘记词典是结构.将它们传递给函数时,它们是隐式不可变的,因此不需要复制.要将可变字典实际传递给函数,可以使用inout参数,不会复制字典(通过引用传递).当您将参数声明为时,将复制作为参数传递的可变字典的唯一情况var.


GoZ*_*ner 8

您始终可以选择使用Dictionary属性定义自定义通用类:

class SharedDictionary<K, V> {
  var dict : Dictionary<K, V>

  // add the methods you need, including overloading operators
}
Run Code Online (Sandbox Code Playgroud)

您的实例SharedDictionary将通过引用传递(不复制).


Jac*_*ack 7

我实际上今天和Swift团队的某个人谈过Swift中的"通过引用传递".这是我得到的:

  1. 众所周知,struct是通过副本传递的,类是通过引用传递的
  2. 我引用"这是非常容易将保鲜膜一个structclass.他指着GoZoner的答案.
  3. 即使struct复制了a ,classes结构中定义的任何内容仍将通过引用传递.
  4. 如果您想在结构上通过引用进行传统传递,请使用 inout.然而,他特别提到"考虑添加另一个返回值而不是使用inout"时这样说.

Dictionary定义KeyTypeValueType作为泛型:

struct Dictionary<KeyType : Hashable, ValueType>
Run Code Online (Sandbox Code Playgroud)

我相信这意味着如果你KeyTypeValueType它们是类对象,它们在复制Dictionary本身时就不会被复制,你也不需要太担心它.

此外,该NSDictionary课程仍可使用!


Les*_*ary 6

正如其他人所说,“Swift 仅在绝对必要时才在幕后执行实际副本。” 所以性能在这里应该不是一个大问题。但是,由于某些其他原因,您可能仍然希望通过引用传递字典。在这种情况下,您可以创建一个如下所示的自定义类并像使用普通字典对象一样使用它:

class SharedDictionary<K : Hashable, V> {
    var dict : Dictionary<K, V> = Dictionary()
    subscript(key : K) -> V? {
        get {
            return dict[key]
        }
        set(newValue) {
            dict[key] = newValue
        }
    }
}
Run Code Online (Sandbox Code Playgroud)