我调用一个函数来处理和修改数组。但阵列根本没有变化。看起来像一个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"
}
}
调用函数后的结果显示原始数组内容。
答案 0 :(得分:6)
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)
答案 1 :(得分:3)
你误解了数组在Swift中是如何工作的。它们是值类型,与Objective-C不同,它们是引用类型。
这意味着函数alter_them
获得了数组的副本,而您实际上正在修改副本。
您需要从alter_them
函数返回修改后的版本,然后重新分配Draw_S
和Draw_E
。
FWIW实例变量通常以小写字符开头,即draw_S
答案 2 :(得分:0)
String和Array都是Swift中的值类型。这就是为什么它没有在方法中修改的原因。您需要从方法返回修改后的数组。
答案 3 :(得分:0)
这不是错误。这是因为Swift中的字符串数组被定义为结构体,因此是值类型。
该函数正在修改作为参数传入的数组,但它是数组Draw_S的副本,依此类推。
如果希望函数修改现有数组但是会破坏Swift的工作方式,则需要将它们定义为inout参数。您最好将结果数组传递出去并存储它。