在一个函数内修改一个数组是行不通的

我调用一个函数来处理和修改一个数组。 但是arrays根本没有改变。 看起来像Swift主要的bug?

var Draw_S = [String](); var Draw_E = [String](); override func viewDidLoad() { super.viewDidLoad() Draw_E.append("E") Draw_E.append("E") Draw_E.append("E") Draw_E.append("E") Draw_E.append("E") Draw_S.append("S") Draw_S.append("S") Draw_S.append("S") Draw_S.append("S") Draw_S.append("S") alter_them(Draw_S, data2: Draw_E) for (ix, _) in Draw_S.enumerate(){ print("index: \(ix) array S: \(Draw_S[ix]) array E: \(Draw_E[ix])") } } func alter_them( var data: [String], var data2: [String]){ for (i, _) in data.enumerate(){ data[i] = "1" } for (i, _) in data2.enumerate(){ data2[i] = "2" } } 

调用函数后的结果显示原始数组内容。

alter_them内的数组是原件的副本

使用inout来修改原始数组:

 func alter_them(inout data: [String], inout data2: [String]){ for (i, _) in data.enumerate(){ data[i] = "1" } for (i, _) in data2.enumerate(){ data2[i] = "2" } } alter_them(&Draw_S, data2: &Draw_E) 

你误解了Swift中的数组是如何工作的。 它们是值types ,与Objective-C不同,它们是引用types

这意味着函数alter_them获得数组的副本 ,而实际上是修改副本。

您将需要从alter_them函数返回修改后的版本,并重新分配Draw_SDraw_E

FWIW实例variables通常以小写字符即draw_S

String和Array都是Swift中的值types。 这就是为什么它不在方法内部修改的原因。 您将需要从方法返回修改的数组。

这不是一个错误。 这是因为Swift中的string数组被定义为结构体,因此是值types。

该函数正在修改作为参数传入的数组,但这是数组Draw_S的副本,等等。

你需要将它们定义为inout参数,如果你想让函数修改现有的数组,但是打破了Swift的工作方式。 你最好传递一个结果数组,然后存储它。