从函数返回可变数组

Dam*_*ien 7 swift

如何从函数返回一个可变数组?

这是一段简短的代码片段,使其更加清晰:

var tasks = ["Mow the lawn", "Call Mom"]
var completedTasks = ["Bake a cake"]

func arrayAtIndex(index: Int) -> String[] {
    if index == 0 {
        return tasks
    } else {
        return completedTasks
    }
}

arrayAtIndex(0).removeAtIndex(0)
// Immutable value of type 'String[]' only has mutating members named 'removeAtIndex'
Run Code Online (Sandbox Code Playgroud)

以下片段有效,但我必须返回一个Array,而不是一个NSMutableArray

var tasks: NSMutableArray = ["Mow the lawn", "Call Mom"]
var completedTasks: NSMutableArray = ["Bake a cake"]

func arrayAtIndex(index: Int) -> NSMutableArray {
    if index == 0 {
        return tasks
    } else {
        return completedTasks
    }
}

arrayAtIndex(0).removeObjectAtIndex(0)

tasks // ["Call Mom"]
Run Code Online (Sandbox Code Playgroud)

谢谢!

dre*_*wag 2

这整个范式在 Swift 中是不鼓励的。swift 中的数组是“值类型”,这意味着它们每次传递时都会被复制。这意味着一旦将数组传递给函数,就无法让该函数修改原始数组的内容。这样就安全多了。

你可以做的是:

var newArray = arrayAtIndex(0)
newArray.removeObjectAtIndex(0)
Run Code Online (Sandbox Code Playgroud)

但请注意,tasks不会被修改。将是删除第一个对象后的NewArray副本tasks

这适用于 NSMutableArray 的原因是 NSArray 和 NSMutableArray 是通过引用复制的,因此除非显式复制,否则它们始终引用原始数组。

  • 感谢您的回答,这完全有道理。然而,值得注意的是,在整个程序中,“tasks”和“completedTasks”是实例变量(用“var”声明),我返回“self.tasks”和“self.completedTasks”。我无法复制返回的数组,删除一个元素,然后将实例变量重新分配给它,因为实例变量本身被转换为不可变的。实例变量在被函数返回后如何可以转换为不可变的? (2认同)