SwiftUI:在UserDefaults中存储数组

时间:2020-10-10 15:57:49

标签: swift swiftui

我很绝望,这很容易解决。 对我来说,将bool值存储在UserDefaults中是没有问题的。请参阅随附的代码。 但是我无法以一种可以将多个切换存储在一个数组中的方式来对其进行更改。

有人知道吗?

import SwiftUI
import Foundation

struct ContentView: View {
    
    @ObservedObject var settings = settingsStore()
    
    var body: some View {
        VStack{
            
            Toggle (isOn: self.$settings.isFavorit) {
                Text("")
                }
        }
        .background(self.$settings.isFavorit.wrappedValue ? Color.green : Color.red)
    }
}


class settingsStore: ObservableObject{
    
    
    @Published var isFavorit: Bool = UserDefaults.standard.bool(forKey: "isFavorit"){
        didSet {
            UserDefaults.standard.setValue(self.isFavorit, forKey: "isFavorit")
        }
    }
    
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        /*@START_MENU_TOKEN@*/Text("Hello, World!")/*@END_MENU_TOKEN@*/
    }
}

1 个答案:

答案 0 :(得分:0)

首先不要使用UserDefault的setValue方法。您应该使用func set(_ value: Any?, forKey defaultName: String)。然后,您可以使用UserDefault的方法func array(forKey defaultName: String) -> [Any]?获取值并将其转换为[Bool]


UserDefaults.standard.set([true, false, true], forKey: "bools")
UserDefaults.standard.array(forKey: "bools") as? [Bool]  // [true, false, true]

编辑/更新:

您可以创建一个isFavorite计算属性,使用getter和setter扩展UserDefaults,以持久保存布尔数组。然后,您可以简单地使用该值来初始化发布的属性,并在其更改时更新其值:

extension UserDefaults {
    var isFavorite: [Bool] {
        get {
            array(forKey: "isFavorit") as? [Bool] ?? []
        }
        set {
            set(newValue, forKey: "isFavorit")
        }
    }
}

class SettingsStore: ObservableObject{
    @Published var isFavorit: [Bool] = UserDefaults.standard.isFavorite {
        didSet {
            UserDefaults.standard.isFavorite = self.isFavorit
        }
    }
}