【问题标题】:error on adding element to NSMutableArray in Xcode 9 Beta 5在 Xcode 9 Beta 5 中向 NSMutableArray 添加元素时出错
【发布时间】:2017-09-02 11:24:26
【问题描述】:

我对以下代码有疑问(我现在正在快速学习) 在行中添加元素时会发生这种情况

items.addObjects(from: [TextField.text!]) 

错误信息是:

2017-09-02 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 = ""
} 

【问题讨论】:

  • 为什么是NSMutableArray??您不能将对象转换为可变的 Foundation 类型。使用 Swift 类型,可以解决问题。在学习 Swift 时:千万不要在 Swift 中使用 NSMutable... 集合类型。

标签: ios swift xcode


【解决方案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 属性)可以安全地展开。
  • UserDefaults 的专用方法stringArray 用于避免类型转换。
  • @IBAction 中传递的 UI 元素始终是对象 (AnyObject)。尽可能使用实际的静态类型(例如UIButton

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多