Не могу сохранить array в userDefaults

swift
swift3

#1

Сохранение не работает… Помогите. Обращаюсь с классу из контроллера

class Favorites {
    
    var favoritesDictionary: [(name: String, r: Int, g: Int, b: Int, hex: String, hsb: String, cmyc: String)] = []
    
    let saveFavorites = UserDefaults.standard
    
    func saveData() {
        saveFavorites.set(favoritesDictionary, forKey: "Favorites")
        saveFavorites.synchronize()
    }
    
    func loadData() {
        
        if saveFavorites.object(forKey: "Favorites") != nil {
            favoritesDictionary = saveFavorites.object(forKey: "Favorites") as! [(name: String, r: Int, g: Int, b: Int, hex: String, hsb: String, cmyc: String)]
        } else {
            print("saveFavorites = nil")
        }
        
    }

Ошибка:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object


#2

Проблема в том, что favoritesDictionary это не Dictionary :]

class Favorite:NSObject, NSCoding {
    
    var name:String
    var r:Int
    var g:Int
    var b:Int
    var hex:String
    var hsb:String
    var cmyc:String
    
    init(name: String, r: Int, g: Int, b: Int, hex: String, hsb: String, cmyc: String) {
        self.name = name
        self.r = r
        self.g = g
        self.b = b
        self.hex = hex
        self.hsb = hsb
        self.cmyc = cmyc
    }
    
    required init?(coder aDecoder: NSCoder) {
        self.name = aDecoder.decodeObject(forKey: "name") as! String
        self.r = aDecoder.decodeInteger(forKey: "r")
        self.g = aDecoder.decodeInteger(forKey: "g")
        self.b = aDecoder.decodeInteger(forKey: "b")
        self.hex = aDecoder.decodeObject(forKey: "hex") as! String
        self.hsb = aDecoder.decodeObject(forKey: "hsb") as! String
        self.cmyc = aDecoder.decodeObject(forKey: "cmyc") as! String
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "name")
        aCoder.encode(r, forKey: "r")
        aCoder.encode(g, forKey: "g")
        aCoder.encode(b, forKey: "b")
        aCoder.encode(hex, forKey: "hex")
        aCoder.encode(hsb, forKey: "hsb")
        aCoder.encode(cmyc, forKey: "cmyc")
    }
}

Ну и подредактируем ваш класс Favorites

class Favorites {
    
    static let instance = Favorites()
    let saveFavorites = UserDefaults.standard
    let favoritesKey = "FavoritesKey"
    
    var favoritesList:[Favorite] {
        get {
            if let favoritesData = saveFavorites.object(forKey: favoritesKey) as AnyObject? {
                if let favoritesList = NSKeyedUnarchiver.unarchiveObject(with: favoritesData as! Data) {
                    return favoritesList as! [Favorite]
                }
            }
            return []
        }
        set(favorites) {
            let favoritesData = NSKeyedArchiver.archivedData(withRootObject: favorites)
            saveFavorites.set(favoritesData, forKey: favoritesKey)
            saveFavorites.synchronize()
        }
    }
    
    func add(favorite: Favorite) {
        var favoritesList = self.favoritesList
        favoritesList.append(favorite)
        self.favoritesList = favoritesList
    }
    
    func delete(favorite:Favorite) {
       /// удаление элемента
    }
}

Ну и в вашем контроллере можно сделать что-то подобное

    let newFavorite = Favorite(name: "color", r: 0, g: 0, b: 0, hex: "0", hsb: "0", cmyc: "0")
    favorites.add(favorite: newFavorite)


#3

Огромное спасибо! Как только разберу код и вникну в суть - отпишусь. Тут много новых для меня вещей )


#4

Спасибо, разобрался - все работает. Поэзия )))