我遇到以下代码的问题(我现在正在学习swift) 在行
中添加元素时会发生这种情况items.addObjects(from: [TextField.text!])
错误消息是:
2017-09-02 13:15:18.542629 + 0200 todolist [88230:154108272] *** 由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:' - [__ NSCFArray insertObject:atIndex:]:发送到不可变对象'
的mutating方法
我正在使用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 = ""
}
答案 0 :(得分:1)
您的代码包含很多问题,这是一个安全的原生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
属性一样 - 可以安全地解包。stringArray
的专用方法UserDefaults
用于避免类型转换。@IBAction
中传递的UI元素始终是对象(AnyObject
)。尽可能使用实际的静态类型(例如UIButton
)