Ios 无法对不可变值使用变异成员:Swift中出错

Ios 无法对不可变值使用变异成员:Swift中出错,ios,swift,xcode,Ios,Swift,Xcode,我创建了一个简短的程序,尝试通过值而不是索引从数组中删除元素。然后,我想打印已删除此元素的更新列表 但是,我得到了一个错误: '无法对不可变值使用mutating member:'list'是'let'常量'。 为什么list是一个常量值?不确定这是否相关,但我将数组quarantineStuff声明为变量。为什么默认情况下,list会取一个常量 var quarantineStuff: [String] = ["zero to one book", "proper twelve whiskey

我创建了一个简短的程序,尝试通过值而不是索引从数组中删除元素。然后,我想打印已删除此元素的更新列表

但是,我得到了一个错误: '无法对不可变值使用mutating member:'list'是'let'常量'。 为什么
list
是一个常量值?不确定这是否相关,但我将数组
quarantineStuff
声明为变量。为什么默认情况下,
list
会取一个常量

var quarantineStuff: [String] = ["zero to one book", "proper twelve whiskey", "coffee", "tonic water", "toilet roll", "broken electronics"]

func removeItemsICantTakeWithMe(list: [String]) -> [String] {
    if let index = list.firstIndex(of: "toilet roll") {
        list.remove(at: index)
    }
    return list
}

let renewedList = removeItemsICantTakeWithMe(list: quarantineStuff)
print(renewedList)

Swift中的所有参数都是隐式的
let
/常量

如果需要修改参数,则需要在代码中将其显式设置为
var

func removeItemsICantTakeWithMe(list: [String]) -> [String] {
    var list = list // insert this line
    if let index = list.firstIndex(of: "toilet roll") {
        list.remove(at: index)
    }
    return list
}

或者,您可以使用
inout
参数来实现类似效果。

非常感谢。你能解释一下为什么“list”是一个常量,这让我创建了一个新的变量来代替它吗?@ArpitSingh在创建参数的本地可变副本时,通常使用与参数相同的名称,
var list=list
。它很好地隐藏了它,因此这两者之间没有混淆,也没有必要随意区分,就像在您需要时在
a
前面加前缀一样did@timman所有非inout参数都是不可变的。如果你想做变异操作,你需要制作一个可变的本地副本。或者,您可以将您的
列表
作为
inout[String]
传入,但如果您可以避免,则通常不建议这样做,除非您有充分的理由这样做。Let是一个不可变的变量,意味着它不能更改,语言将其称为常量。Var是一个可变变量,这意味着它可以更改。谢谢。我确实知道let和var之间的主要区别,但我只是想知道为什么作为给定参数的list被设置为常量,因此需要创建变量副本@Alexander在上面说“所有非inout参数都是不可变的”。这是什么意思?
func removeItemsICantTakeWithMe(list: [String]) -> [String] {
    var list = list // insert this line
    if let index = list.firstIndex(of: "toilet roll") {
        list.remove(at: index)
    }
    return list
}