Dictionary swift字典嵌套数组操作-无法在字典内变异嵌套数组

Dictionary swift字典嵌套数组操作-无法在字典内变异嵌套数组,dictionary,swift,Dictionary,Swift,为什么“dict”没有改变?是因为“alphaList”是数组的副本,而不是字典中的实际数组吗?有人能告诉我在Swift语言文档中哪里可以找到这些信息吗 操作字典值(复杂类型)的正确方法是什么?此链接应该会有所帮助 Swift的字符串、数组和字典类型被实现为结构。这意味着字符串、数组和字典在分配给新常量或变量或传递给函数或方法时被复制 Swift数组和字典是值(struct)的倍。对这样的实例只有一个引用。而NSArray和nsdictional是class类型,可能有多个引用此类实例 语句v

为什么“dict”没有改变?是因为“alphaList”是数组的副本,而不是字典中的实际数组吗?有人能告诉我在Swift语言文档中哪里可以找到这些信息吗

操作字典值(复杂类型)的正确方法是什么?

此链接应该会有所帮助


Swift的字符串、数组和字典类型被实现为结构。这意味着字符串、数组和字典在分配给新常量或变量或传递给函数或方法时被复制

Swift数组和字典是值(
struct
)的倍。对这样的实例只有一个引用。而
NSArray
nsdictional
class
类型,可能有多个引用此类实例

语句
var alphaList=dict[“alpha”]
[“a”、“b”、“c”、“d”]
创建副本,因此无法更改原始数组

如果要对原始的
“alpha”
进行变异,必须使用
dict
作为根变量:

var dict = ["alpha": ["a", "b", "c", "d"]]
// output : ["alpha": ["a", "b", "c", "d"]]

var alphaList = dict["alpha"]
// output : {["a", "b", "c", "d"]

alphaList?.removeAtIndex(1)
// output : {Some "b"}

alphaList
// output : {["a", "c", "d"]}

dict
// output : ["alpha": ["a", "b", "c", "d"]]

您是对的,
alphaList
是一个副本,因此您对它所做的任何更改都是本地的,不会影响原始数组。文档在中对此进行了描述

从其他地方提取数组后,对其进行更改的唯一方法是使用
inout
参数修饰符,通过引用将数组传递给函数:

dict["alpha"]?.removeAtIndex(1)

好问题是它创建了值的副本在您的情况下值是数组

func modifyAlphaList(inout alphaList: [String]?) {
    alphaList?.removeAtIndex(1)
}

modifyAlphaList(&dict["alpha"])
dict // (.0 "alpha", ["a", "c", "d"])
为了直接获得原始数组,请使用

    var alphaList = dict["alpha"] 
/* which is the copy of original array 
changing it will change the local array alphaList as you can see by your output */
    output : {Some "b"}
或者使用密钥更新它

dict["alpha"]?.removeAtIndex(1)
苹果公司:

Swift的字符串、数组和字典类型被实现为结构。这意味着字符串、数组和字典在分配给新常量或变量或传递给函数或方法时被复制


此行为不同于NSLASH、NSARDATA和NAS字典中的基础,它们被实现为类,而不是结构。NSString、NSArray和NSDictionary实例始终作为对现有实例的引用而不是副本进行分配和传递。“

当在字典中获取数组的引用时,它实际上是一个副本/不同的实例——当我在操场上玩耍时,我得到了
var d=[“t”:[“a”,“b”,“c”,“d”]/[“t”:[“a”,“b”,“c”,“d”]]
var a=d[“t”]/{a”,“b”,“c”,“d”}
a?.removatendex(1)/{
a/{[“a”、“c”、“d”]}
d/[“t”:[“a”、“b”、“c”、“d”]]
unsafeAddressOf(a!)/“UnsafePointer(0x7ff8c1c08c0)”
unsafeAddressOf(d[“t”!/“UnsafePointer(0x7FF8C1F00990)”
unsafeAddressOf(d)/“UnsafePointer(0x7ff8c1c10090)”
alphaList?.removeAtIndex(1)
dict["alpha"] = alphaList