在Xcode 9 Beta 5中向NSMutableArray添加元素时出错

时间:2017-09-02 11:24:27

标签: ios swift xcode

我遇到以下代码的问题(我现在正在学习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 = ""
} 

1 个答案:

答案 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