[__NSCFArray insertObject:atIndex:]:发送到不可变对象的变异方法',线程:SIGABRT
[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object', Thread: SIGABRT
我正在构建一个待办事项列表应用程序。当我按下 "Add Task" 按钮时,我的应用程序崩溃并出现以下错误:
[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
它也 returns 我线程 SIGABRT 错误。任何帮助将不胜感激。
这是我的 SecondViewController
class SecondViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var taskValue: UITextField!
@IBAction func addTask(_ sender: Any) {
let itemsObject = UserDefaults.standard.object(forKey: "items")
var items:NSMutableArray!
if let tempItems = itemsObject as? NSMutableArray{
items = tempItems
items.addObjects(from: [taskValue.text!])
} else{
items = [taskValue.text!]
}
UserDefaults.standard.set(items, forKey: "items")
taskValue.text = ""
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
我的第一个视图控制器在这里:
class FirstViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{
var items: NSMutableArray = []
//table view
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellContent = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell")
var cellLabel = ""
if let tempLabel = items[indexPath.row] as? String{
cellLabel = tempLabel
}
cellContent.textLabel?.text = cellLabel
return cellContent
}
override func viewDidLoad() {
super.viewDidLoad()
let itemsObject = UserDefaults.standard.object(forKey: "items")
if let tempItems = itemsObject as? NSMutableArray{
items = tempItems
}
}
}
错误发生是因为您无法将 Swift 数组转换为 NSMutableArray
。根本不要在 Swift 中使用 NSMutable...
基础类型。
在Swift中获取可变对象非常容易,只需使用var
关键字即可。
并且UserDefaults
有专门的方法来获取字符串数组。
@IBAction func addTask(_ sender: Any) {
var items : [String]
if let itemsObject = UserDefaults.standard.stringArray(forKey: "items") {
items = itemsObject
items.append(taskValue.text!) // it's pointless to use the API to append an array.
} else{
items = [taskValue.text!]
}
UserDefaults.standard.set(items, forKey: "items")
taskValue.text = ""
}
我正在构建一个待办事项列表应用程序。当我按下 "Add Task" 按钮时,我的应用程序崩溃并出现以下错误:
[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
它也 returns 我线程 SIGABRT 错误。任何帮助将不胜感激。
这是我的 SecondViewController
class SecondViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var taskValue: UITextField!
@IBAction func addTask(_ sender: Any) {
let itemsObject = UserDefaults.standard.object(forKey: "items")
var items:NSMutableArray!
if let tempItems = itemsObject as? NSMutableArray{
items = tempItems
items.addObjects(from: [taskValue.text!])
} else{
items = [taskValue.text!]
}
UserDefaults.standard.set(items, forKey: "items")
taskValue.text = ""
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
我的第一个视图控制器在这里:
class FirstViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{
var items: NSMutableArray = []
//table view
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellContent = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell")
var cellLabel = ""
if let tempLabel = items[indexPath.row] as? String{
cellLabel = tempLabel
}
cellContent.textLabel?.text = cellLabel
return cellContent
}
override func viewDidLoad() {
super.viewDidLoad()
let itemsObject = UserDefaults.standard.object(forKey: "items")
if let tempItems = itemsObject as? NSMutableArray{
items = tempItems
}
}
}
错误发生是因为您无法将 Swift 数组转换为 NSMutableArray
。根本不要在 Swift 中使用 NSMutable...
基础类型。
在Swift中获取可变对象非常容易,只需使用var
关键字即可。
并且UserDefaults
有专门的方法来获取字符串数组。
@IBAction func addTask(_ sender: Any) {
var items : [String]
if let itemsObject = UserDefaults.standard.stringArray(forKey: "items") {
items = itemsObject
items.append(taskValue.text!) // it's pointless to use the API to append an array.
} else{
items = [taskValue.text!]
}
UserDefaults.standard.set(items, forKey: "items")
taskValue.text = ""
}