2017-09-02 40 views
1

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

为什么'NSMutableArray'?您不能将对象投射到可变基础类型。使用Swift类型,解决问题。正如你在学习Swift一样:在Swift中根本不要使用'NSMutable ...'集合类型。 – vadian

回答

1

你的代码中包含了很多的问题代码的完整组成部分,这是一个安全的原生斯威夫特版本:

@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可选值安全解开。
  • 专用方法的UserDefaultsstringArray用来避免型铸件。在@IBAction传递
  • UI元素始终对象(AnyObject)。尽可能使用实际的静态类型(例如UIButton