我对以下代码有疑问(我现在正在快速学习) 在行中添加元素时会发生这种情况
items.addObjects(from: [TextField.text!])
错误信息是:
2017-09-02 13:15:18.542629+0200 todolist[88230:154108272] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
我正在使用 XCcode 9 Beta 5
这是完整的部分代码
@IBOutlet weak var TextField: UITextField!
@IBAction func Action(_ sender: Any) {
let itemsObject = UserDefaults.standard.object(forKey: "items")
var items:NSMutableArray = []
if let tempItems = itemsObject as? NSMutableArray {
items = tempItems
items.addObjects(from: [TextField.text!])
} else {
items = [TextField.text!]
}
UserDefaults.standard.set(items, forKey: "items")
TextField.text = ""
}
最佳答案
您的代码包含很多问题,这是一个安全的原生 Swift 版本:
@IBOutlet weak var textField: UITextField!
@IBAction func action(_ sender: AnyObject) {
guard let textToAppend = textField.text else { return }
var items : [String]
if let itemsObject = UserDefaults.standard.stringArray(forKey: "items") {
items = itemsObject
} else {
items = [String]()
}
items.append(textToAppend)
UserDefaults.standard.set(items, forKey: "items")
textField.text = ""
}
请注意:
- 如评论中所述,使用具体类型
[String]
而不是不相关且未指定的NSMutableArray
。 - 使用
var
关键字,您可以免费获得可变性。 - 变量和方法名称始终以小写字母开头。
- 可以是
nil
的可选值(如text
属性)已安全展开。 UserDefaults
的专用方法stringArray
用于避免类型转换。@IBAction
中传递的 UI 元素始终是对象 (AnyObject
)。尽可能使用实际的静态类型(例如UIButton
)
关于ios - 在 Xcode 9 Beta 5 中向 NSMutableArray 添加元素时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46013276/