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