从Array对象中删除条目

时间:2015-06-16 08:53:10

标签: ios arrays swift

我有一个类对象数组,我想在特定索引处删除其中一个。该类包含简单变量。我尝试使用方法 removeAtIndex(index)。 但我收到错误: 类型的不可变值' [FieldData]'只有名为' removeAtIndex' 的变异成员 我发现要解决这个问题,我应该在我的方法的函数之前编写变异。但现在我收到了错误: '突变'对类或类绑定协议中的方法无效

有人能指出我正确的方向回答,我错误地使用了一个类吗? 或者我的问题是什么?

感谢您的帮助。

一般课程定义:

class FieldData {    
    //string variables

    init(variables) {
        ...
    }
}

方法定义

mutating func WandBestandEntf(fields: [FieldData]) -> [FieldData]? {
    for var n = 0 as Int; n < fields.count; n++ {
        if fields[n].name == "something" || fields[n].name == "other thing" {
            fields.removeAtIndex(n)
        }
    }
}

2 个答案:

答案 0 :(得分:4)

在swift函数中,默认情况下参数是常量。所以你无法改变它。

在您的方法中,只需在参数名称之前添加var

func WandBestandEntf(var fields: [FieldData]) -> [FieldData]? {
    for var n = 0 as Int; n < fields.count; n++ {
       if fields[n].name == "something" || fields[n].name == "other thing" {
        fields.removeAtIndex(n)
       }
    }
    return fields
 } 

答案 1 :(得分:4)

Dhaval Thanki的答案是解决问题的一种方法。为了完整性,通过引用而不是通过值将参数传递给方法,还有另一种实现相同的方法:

func WandBestandEntf(inout fields: [FieldData]) {
    for var n = 0 as Int; n < fields.count; n++ {
        if fields[n].name == "something" || fields[n].name == "other thing" {
            fields.removeAtIndex(n)
        }
    }
}

inout修饰符告诉方法fields参数是通过引用传递的,因此它可以在方法体内更新,并且对原始数据执行的任何更改都将对原始数据执行,而不是它的副本(通过使用var)。

由于更改已到位,因此无需返回更新的数据。

另请注意,为了明确参数通过引用传递,在调用方法时,它必须以&运算符为前缀,这意味着&#34; 引用&#34;:

var array = [...]
WandBestandEntf(&array)

最后,请注意传递给方法的参数必须是可变的(即使用var声明)。尝试传递对immutable的引用会引发明显的编译错误:

let array = [...]
WandBestandEntf(&array) // Error: Cannot assign to immutable value of type '[FieldData]'