修改函数内的数组不起作用

时间:2015-09-23 11:04:13

标签: ios swift

我调用一个函数来处理和修改数组。但阵列根本没有变化。看起来像一个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"
    }
}

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

4 个答案:

答案 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_SDraw_E

FWIW实例变量通常以小写字符开头,即draw_S

答案 2 :(得分:0)

String和Array都是Swift中的值类型。这就是为什么它没有在方法中修改的原因。您需要从方法返回修改后的数组。

答案 3 :(得分:0)

这不是错误。这是因为Swift中的字符串数组被定义为结构体,因此是值类型。

该函数正在修改作为参数传入的数组,但它是数组Draw_S的副本,依此类推。

如果希望函数修改现有数组但是会破坏Swift的工作方式,则需要将它们定义为inout参数。您最好将结果数组传递出去并存储它。