Ios 类型为'的不可变值;任何[]和#x27;只有名为'的变异成员;追加';在Swift中,尽管数组定义为';var';
我想将一个新对象附加到我的数组中,该数组在我的Swift应用程序中定义为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
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
。可能的副本