误差上在Xcode 9贝塔添加元素的NSMutableArray 5
问题描述:
我有以下代码中的问题(我正在学习现在SWIFT) 管线添加元素时误差上在Xcode 9贝塔添加元素的NSMutableArray 5
items.addObjects(from: [TextField.text!])
该错误消息是它发生:
2017年9月2日13:15:18.542629 + 0200 todolist的[88230:154108272] *** 终止应用程序由于未捕获的异常 'NSInternalInconsistencyException',原因:“ - [__ NSCFArray insertObject:atIndex :]:变异方法发送到不可变对象”
我使用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 = ""
}
答
你的代码中包含了很多的问题代码的完整组成部分,这是一个安全的原生斯威夫特版本:
@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
关键字,你可以免费获得可变性。 - 变量和方法名始终以小写字母开头。像
text
财产 - - - 可以是
nil
可选值安全解开。 - 专用方法的
UserDefaults
stringArray
用来避免型铸件。在@IBAction
传递 - UI元素始终对象(
AnyObject
)。尽可能使用实际的静态类型(例如UIButton
)
为什么'NSMutableArray'?您不能将对象投射到可变基础类型。使用Swift类型,解决问题。正如你在学习Swift一样:在Swift中根本不要使用'NSMutable ...'集合类型。 – vadian