swift - 尝试插入非属性列表对象
问题描述
Swift
当我尝试运行模拟器时出现此错误:
"Attempt to insert non-property list object (\n
\"grrrr.Flashcard(question: \\\"What continent is Spain in?\\\", answer:
\\\"Europe.\\\")\"\n) for key flashcards"
这是代码:
import UIKit
struct Flashcard {
var question: String
var answer: String
}
class ViewController: UIViewController {
@IBOutlet weak var frontLabel: UILabel!
@IBOutlet weak var backLabel: UILabel!
@IBOutlet weak var prevButton: UIButton!
@IBOutlet weak var nextButton: UIButton!
var flashcards = [Flashcard]()
var currentIndex = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
readSavedFlashcards()
if flashcards.count == 0 {
updateFlashcard(question: "What continent is Spain in?", answer: "Europe.")
} else {
updateLabels()
updateNextPrevButtons()
}
}
@IBAction func didTapOnFlashcard(_ sender: Any) {
if frontLabel.isHidden {
frontLabel.isHidden = false
}
else {
frontLabel.isHidden = true
}
}
func updateFlashcard(question: String, answer: String) {
let flashcard = Flashcard(question: question, answer: answer)
frontLabel.text = flashcard.question
backLabel.text = flashcard.answer
flashcards.append(flashcard)
print(" Added new flashcard")
print(" We now have \(flashcards.count) flashcards")
currentIndex = flashcards.count - 1
print(" Our current index is \(currentIndex)")
updateNextPrevButtons()
updateLabels()
saveAllFlashcardsToDisk()
}
func updateNextPrevButtons() {
if currentIndex == 0 {
prevButton.isEnabled = false
print("If statement works")
} else {
prevButton.isEnabled = true
}
if currentIndex == flashcards.count - 1 {
nextButton.isEnabled = false
} else {
nextButton.isEnabled = true
}
}
func updateLabels() {
let currentFlashcard = flashcards[currentIndex]
frontLabel.text = currentFlashcard.question
backLabel.text = currentFlashcard.answer
}
@IBAction func didTapOnPrev(_ sender: Any) {
currentIndex = currentIndex - 1
updateLabels()
updateNextPrevButtons()
}
@IBAction func didTapOnNext(_ sender: Any) {
currentIndex = currentIndex + 1
updateLabels()
updateNextPrevButtons()
}
func saveAllFlashcardsToDisk() {
let dictionaryArray = flashcards.map { (card) -> [String: String] in return ["question": card.question, "answer": card.answer]
}
UserDefaults.standard.set(flashcards, forKey: "flashcards")
print(" Flashcards saved to UserDefaults")
}
func readSavedFlashcards() {
if let dictionaryArray = UserDefaults.standard.array(forKey: "flashcards") as? [[String: String]] {
let savedCards = dictionaryArray.map { dictionary -> Flashcard in return Flashcard(question: dictionary["question"]!, answer: dictionary["answer"]!)
}
flashcards.append(contentsOf: savedCards)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?){
let navigationController = segue.destination as! UINavigationController
let creationController = navigationController.topViewController as! CreationViewController
creationController.flashcardsController = self
}
}
解决方案
这实际上是一个错字。你想保存映射的[[String:String]]
数组,所以替换flashcards
为dictionaryArray
func saveAllFlashcardsToDisk() {
let dictionaryArray = flashcards.map { (card) -> [String: String] in return ["question": card.question, "answer": card.answer]
}
UserDefaults.standard.set(dictionaryArray, forKey: "flashcards")
print(" Flashcards saved to UserDefaults")
}
考虑使用Codable
来序列化自定义结构。
推荐阅读
- c# - 使用 oauth2.0 成功生成访问令牌后,将文件/文件夹上传到 Webapplication 中的 onedrive/sharepoint
- java - Jersey POST 方法参数为空
- javascript - TypeError:Recaptcha 不是构造函数
- authentication - Using ambassador authservice to only require basic auth on some routes/urls (or services)
- antlr4 - how to use sequence for tokenazation but not returned as par of result
- objective-c - Why did Apple design __block for write auto var in block?
- scala - Scala:具有不同上下文和依赖关系的 ReaderT 组合
- javascript - 调用异步函数 main 的正确方法?
- ethereum - 功能的气体估计:无限
- tfs - 如何将测试计划(或测试用例)从一个 VSTS 迁移到另一个 VSTS?