0

这种奇怪的行为让我感到困惑。我打算创建一个带有单个数组字段的字典。然后在这个数组中,附加了两个额外的子字典。这是代码,

    var dictionary = [String: Any]()
    var array = [[String: Any]]()
    dictionary["array"] = array

    var dict1:[String:Any] = ["abc": 123, "def": true]
    var dict2:[String:Any] = ["111": 1.2345, "222": "hello"]
    array.append(dict1)
    array.append(dict2)

调试器输出

在此处输入图像描述

从调试器输出中可以看到,var 数组已成功更新(附加了 2 个子字典)。但dictionary["array"]仍然有 0 值。

看起来 ( dictionary["array"]) 和 ( array) 是两个独立的对象

4

1 回答 1

1

是的,它们是分开的。该元素dictionary["array"]是类型的不可变值,Array<_>因为它作为值类型添加到字典而不是引用类型。

如果您尝试dict1通过像这样的封装字典寻址元素来添加到数组中:

(dictionary["array"] as! Array).append(dict1)

你会看到这样的错误:

error: cannot use mutating member on immutable value of type 'Array<_>'

Swift Language docs中,强调了:

值类型是一种类型,其值在分配给变量或常量或传递给函数时被复制。

在前面的章节中,您实际上已经广泛使用了值类型。事实上,Swift 中的所有基本类型——整数、浮点数、布尔值、字符串、数组和字典——都是值类型,并且在幕后作为结构实现。

于 2018-04-19T02:05:58.853 回答