Swift可变方法发送到不可变对象

3

我真的无法理解这个错误,我正在尝试像在Objective-C中那样将字符串添加到数组中,但是Swift给了我一个奇怪的错误。

var fileArray:NSMutableArray = []

alert.addAction(UIAlertAction(title: "Done", style: UIAlertActionStyle.Default, handler:{ (UIAlertAction)in
            self.fileArray.addObject(self.urlTextField.text)
            self.processURL()
        }))

错误:
因为发送到不可变对象的可变方法,终止应用程序,异常原因为:'-[__NSCFArray insertObject:atIndex:]'

fileArray 怎么会是不可变的?我将其声明为 MutableArray !!!!!!

编辑::: 所以问题在于我填充数组的方式

fileArray = myDict?.valueForKey("fileList") as! NSMutableArray

这解决了问题。

fileArray = myDict?.valueForKey("fileList")!.mutableCopy() as! NSMutableArray

你确定问题与 fileArray 对象有关吗?你能添加异常断点并检查应用程序在哪一行崩溃吗? - Vlad Papko
我无法重现你的错误。你能否通过 CMD+CLICK 检查 self.fileArray 的类型?这样你就可以知道它是否确实是一个奇怪的 Swift bug,还是 self.fileArray 可能不是这个 NSMutableArray。 - Eric Aya
@MordFustang 是的。那是完全不同的情况,这是预期的行为。 - Rob Napier
1
是的,这就是问题所在。as! NSMutableArray 只是让编译器保持沉默,但并没有使实际值可变。你需要在 myDict?.valueForKey("fileList") 调用的结果上调用 mutableCopy - Vlad Papko
1
@MordFustang,你能否检查一下这段代码是否适用于你:fileArray = myDict?.valueForKey("fileList")!.mutableCopy() as! NSMutableArray - Subbu
显示剩余3条评论
2个回答

3

仅仅因为你声明一个数组是可变的或者使用 as! NSMutableArray 进行强制转换并不能使其变为可变的。只有当你使用 [[NSMutableArray alloc] ....] 创建一个可变数组或通过对一个数组进行 mutableCopy 操作后,该数组才会变成可变的。

(对于字典、字符串、NSSet 和 NSData 也是同样的情况)


0

由于您的数组仅包含单一类型,我建议使用Swift类型,这样会更容易,var是可变的,let是不可变的。

var fileArray : Array<String> = []

alert.addAction(UIAlertAction(title: "Done", style: UIAlertActionStyle.Default, handler:{ (UIAlertAction)in
            self.fileArray.append(self.urlTextField.text)
            self.processURL()
        }))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接