Это соглашение Swift, чтобы называть ваши структуры, начиная с прописной буквы. Вам нужно сделать класс, сделать его NSCoding податливыми и использовать KeyedArchiever для сохранения данных объекта
class Task: NSObject, NSCoding {
let name: String
let desc: String
required init(name: String, desc: String) {
self.name = name
self.desc = desc
}
func encode(with coder: NSCoder) {
coder.encode(name, forKey: "name")
coder.encode(desc, forKey: "desc")
}
required init(coder decoder: NSCoder) {
self.name = decoder.decodeObject(forKey: "name") as? String ?? ""
self.desc = decoder.decodeObject(forKey: "desc") as? String ?? ""
}
}
Тестирование
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var descField: UITextField!
@IBOutlet weak var tableView: UITableView!
var tasks: [Task] = []
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
if let data = UserDefaults.standard.data(forKey: "tasks") {
tasks = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Task] ?? []
tableView.reloadData()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func addTask(_ sender: UIButton) {
guard let name = nameField.text, let desc = descField.text else { return }
tasks.append(Task(name: name, desc: desc))
UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: tasks) , forKey: "tasks")
tableView.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tasks.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellID")!
cell.textLabel?.text = tasks[indexPath.row].name + " - " + tasks[indexPath.row].desc
return cell
}
}
Если имя вашего начиная с-структуру прописной буквы. Вам нужно создать класс, сделать его совместимым с NSCoding и использовать KeyedArchiever для сохранения данных объекта. –
@LeoDabus. Невозможно сохранить данные массива с помощью NSUserDefaults? –
Вы можете использовать UserDeafaults для сохранения объекта Data из KeyedArchiever –