Я в отчаянии в точке, которую, вероятно, очень легко решить. Для меня не проблема сохранить значение типа 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
Michael 10 Окт 2020 в 18:57

1 ответ

Лучший ответ

Во-первых, не используйте метод 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, расширяющее 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
        }
    }
}
0
Leo Dabus 10 Окт 2020 в 17:31