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)
}
首先,请符合命名约定的结构和班级名称以大写字母开头的命名约定,这是结构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?
错误。处理