Добавление массива в список (я не вижу более одного элемента в списке) - PullRequest
0 голосов
/ 26 апреля 2018
import Foundation

struct answers : Codable {
    var answer : String
    var number : Int
}

var allAnswers: Array = [answers]()

let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let archiveURL = documentsDirectory.appendingPathExtension("answers_test").appendingPathExtension("plist")

class ViewController: UIViewController {

    @IBOutlet var vcLabels: [UILabel]!
    @IBOutlet weak var vcTextField: UITextField!
    var index : Int = 0
    @IBAction func vcButtonPressed(_ sender: Any) {
       vcLabels[index].text =  vcTextField.text
      var newAnswer = answers(answer: vcLabels[index].text!, number: index)

        var newAnswers = [newAnswer]
       print(archiveURL)
        index += 1

        if index == 4 {
            index = 0
        }

        let propertyListEncoder = PropertyListEncoder()
        let encodedNotes = try? propertyListEncoder.encode(newAnswers)
        try? encodedNotes?.write(to:archiveURL, options: .noFileProtection)


    }

1 Ответ

0 голосов
/ 26 апреля 2018

Прежде всего, пожалуйста, соблюдайте соглашение об именах, согласно которому имена структур и классов начинаются с заглавной буквы, и выгода в том, что структура Answer и свойство answer не могут быть ошибочными.И чтобы избежать путаницы, назовите структуру в единственном числе (в строке, где создается новый ответ, вы создаете семантически один ответ, а не один ответ ).И свойства могут быть объявлены как константы (let).

struct Answer : Codable {
    let answer : String
    let number : Int
}

Ваша проблема очень ясна: если вы хотите добавить что-то в файл списка свойств, вы должны прочитать сначала из archiveURL, добавьте элемент (ы) и запишите его обратно.

@IBAction func vcButtonPressed(_ sender: Any) {
    vcLabels[index].text =  vcTextField.text
    let newAnswer = Answer(answer: vcLabels[index].text!, number: index)
    print(archiveURL)
    index += 1

    if index == 4 {
        index = 0
    }

    do {
        let data = try Data(contentsOf: archiveURL)
        var savedAnswers = PropertyListDecoder().decode([answers], from: data)
        savedAnswers.append(newAnswer)

        let encodedNotes = try PropertyListEncoder().encode(savedAnswers)
        try encodedNotes?.write(to:archiveURL, options: .noFileProtection)
    } catch { print(error) }

}

И не игнорируйте ошибки с try?. Обращайтесь с ними

...