Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 类型为'的不可变值;任何[]和#x27;只有名为'的变异成员;追加';在Swift中,尽管数组定义为';var';_Ios_Swift - Fatal编程技术网

Ios 类型为'的不可变值;任何[]和#x27;只有名为'的变异成员;追加';在Swift中,尽管数组定义为';var';

Ios 类型为'的不可变值;任何[]和#x27;只有名为'的变异成员;追加';在Swift中,尽管数组定义为';var';,ios,swift,Ios,Swift,我想将一个新对象附加到我的数组中,该数组在我的Swift应用程序中定义为var,但尽管我将其定义为var,但在尝试附加它时发生了以下错误 `Immutable value of type 'Any[]' only has mutating members named 'append'` 这是我的密码: var contactsArray: Any[]! func popoverWillClose(notification: NSNotification) { if popoverTxt

我想将一个新对象附加到我的数组中,该数组在我的Swift应用程序中定义为
var
,但尽管我将其定义为
var
,但在尝试附加它时发生了以下错误

`Immutable value of type 'Any[]' only has mutating members named 'append'`
这是我的密码:

var contactsArray: Any[]!
func popoverWillClose(notification: NSNotification) {
    if popoverTxtName.stringValue != "" && popoverTxtContactInfo.stringValue != "" {
        contactsArray.append(makeDictionaryRecord(popoverTxtName.stringValue, withInfo: popoverTxtContactInfo.stringValue))
    }
}
makeDictionaryRecord(withInfo:)
方法获取两个
字符串
并返回
字典

我最初的代码将contactsArray定义为
let
,后来我发现这是我的错误,所以我将其更改为
var
。然而,事情到目前为止仍然没有进展

我还将
contactsArray
的组件类型更改为
AnyObject[]
Any[]
AnyObject[],但没有任何更改

(也就是说,由于
联系人数组
必须包含
字典
,因此必须将其定义为
Any[]
Any[]!
,因为
字典
定义为struct,如果我理解正确的话。)

我的代码怎么了?如何将组件正确地附加到
contactsArray

问题1:您已将
contactsArray
定义为隐式展开可选,但可选变量的值始终不可变。您可以这样定义它,以允许附加值:

var contactsArray: [Any]

更新:自从Swift通过可选链接引入赋值后,这就不是问题了。对于隐式展开的选项,这会自动发生

问题2:您没有给数组一个初始值——编译器开始抱怨,当您为隐式展开的可选项修复问题1时,这意味着该值为
nil
,因此您将得到一个运行时异常。解决方案是使用空数组初始化变量:

var contactsArray: [Any]! = []
您几乎不需要一个可选数组空数组与
nil
一样是“无值”的一个很好的标志,引导起来更安全。如果您决定使用可选数组,请使用常规可选数组(即用
声明),而不是隐式展开的数组:

var contactsArray: [Any]? = []

数组声明的语法已更改,现在

var合同ray:[Any]=[]

此外,如果要将数组作为结构或枚举的一部分进行修改,则可能会看到此错误。结构或枚举是一种值类型,该方法需要
mutating
关键字:

struct contacts {
    var contactsArray:[Any] = []
    mutating func popoverWillClose(notification: NSNotification) {
        if popoverTxtName.stringValue != "" && popoverTxtContactInfo.stringValue != "" {

            contactsArray.append(makeDictionaryRecord(popoverTxtName.stringValue, withInfo: popoverTxtContactInfo.stringValue))
        }
    }
}

此外,您不能使用
let
关键字将带有变异方法的结构实例保存为常量,它需要声明为
var
,因为调用变异函数时变量的值会发生变化。

!我不知道可选项总是不可变的。但是,仍然可以将数组定义为可选和可变的吗?我可能想在应用程序的生命周期内分配
nil
,不!我会坚持使用空数组,而不是
nil
。如果您确实需要可选性(?),则必须制作数组的可变非可选副本,添加到数组中,然后重新分配给
self.contactsArray
。可能的副本