0

I'm trying to save an array set to user defaults as part of a class, but I get an error whenever I add to the array in a view. Everything else works when I change the variable (i.e., saved to userdefaults and available in the changed state when I restart the app). The issue seems to be in writing the data to the UserDefaults rather than initializing it or reading it. Thanks!

Thread 1: "Attempt to insert non-property list object {(\n 20\n)} for key savedFavs"

Here's the code

import Foundation
import Combine
import SwiftUI

class Preferences: ObservableObject {
    @Published var chosenVersion: Int {
        didSet {
            UserDefaults.standard.set(self.chosenVersion, forKey: "savedVersion")
        }
    }
    @Published var isPsalmsExpanded: Bool {
        didSet {
            UserDefaults.standard.set(self.isPsalmsExpanded, forKey: "savedExpanded")
        }
    }
    @Published var showMT: Bool {
        didSet {
            UserDefaults.standard.set(self.showMT, forKey: "savedMT")
        }
    }
    @Published var fontSize: Int {
        didSet {
            UserDefaults.standard.set(self.fontSize, forKey: "savedSize")
        }
    }
    @Published var scrollPosition: Int = 0
    @Published var preferredColor: ColorScheme {
        didSet {
            UserDefaults.standard.set(self.preferredColor, forKey: "savedColor")
        }
    }
    @Published var favPsalms: Set<Int> {
        didSet {
            UserDefaults.standard.set (self.favPsalms, forKey: "savedFavs")
        }
    }
    
    init() {
        self.chosenVersion = UserDefaults.standard.object(forKey: "savedVersion") as? Int ?? 0
        self.isPsalmsExpanded = UserDefaults.standard.object(forKey: "savedExpanded") as? Bool ?? false
        self.showMT = UserDefaults.standard.object(forKey: "savedMT") as? Bool ?? false
        self.fontSize = UserDefaults.standard.object(forKey: "savedSize") as? Int ?? 20
        self.preferredColor = UserDefaults.standard.object(forKey: "savedColor") as? ColorScheme ?? .light
        self.favPsalms = UserDefaults.standard.object(forKey: "savedFavs") as? Set<Int> ?? Set<Int>()
    }
}
  • Does this answer your question? [Swift user defaults - array](https://stackoverflow.com/questions/52273624/swift-user-defaults-array) – lorem ipsum Dec 25 '21 at 22:52
  • What is `ColorScheme`? It must be Property List compliant otherwise you can't save it to `UserDefaults`. A `Set` is not Property List compliant but can be easily converted to array and vice versa. And there is `array(forKey:`, `integer(forKey:` and `bool(forKey:` in`UserDefaults`. – vadian Dec 26 '21 at 08:11

0 Answers0