Просмотр исходного кода

feat: provide bindings for UserDefaults

Sam Jaffe 3 недель назад
Родитель
Сommit
ba2925ba03
3 измененных файлов с 21 добавлено и 1 удалено
  1. 8 1
      Todos/TodosApp.swift
  2. 1 0
      Todos/View/CreateHintPopover.swift
  3. 12 0
      Todos/ViewModel/URLHintArray.swift

+ 8 - 1
Todos/TodosApp.swift

@@ -8,6 +8,11 @@
 import SwiftUI
 import SwiftData
 
+struct UserDefaultsKeys {
+  private static let root = "leumasjaffe.Todos"
+  static let UrlHints = root + ".URLHints"
+}
+
 @main
 struct TodosApp: App {
   var sharedModelContainer: ModelContainer = {
@@ -24,10 +29,12 @@ struct TodosApp: App {
   }()
 
   var body: some Scene {
+    let urlHints = UserDefaults.standard.array(forKey: UserDefaultsKeys.UrlHints)
+      as? URLHintArray.Serial
     WindowGroup {
         ContentView()
     }
     .modelContainer(sharedModelContainer)
-    .environmentObject(URLHintArray())
+    .environmentObject(URLHintArray(fromSerial: urlHints))
   }
 }

+ 1 - 0
Todos/View/CreateHintPopover.swift

@@ -24,6 +24,7 @@ struct CreateHintPopover: View {
       }
       Button(action: {
         allHints.array.append(currentHint)
+        UserDefaults.standard.set(allHints.serial, forKey: UserDefaultsKeys.UrlHints)
         currentHint = URLHint()
         showingPopup = false
       }) {

+ 12 - 0
Todos/ViewModel/URLHintArray.swift

@@ -10,6 +10,8 @@ import SwiftData
 internal import Combine
 
 class URLHintArray : ObservableObject {
+  typealias Serial = [[String:String]]
+
   @Published var array: [URLHint] = [URLHint]()
   
   init() {}
@@ -17,4 +19,14 @@ class URLHintArray : ObservableObject {
   init(_ array: [URLHint]) {
     self.array = array
   }
+  
+  init(fromSerial: Serial?) {
+    self.array = fromSerial?.map({
+      URLHint(prefix: $0["prefix"]!, replacement: $0["replacement"]!)
+    }) ?? []
+  }
+
+  var serial: Serial {
+    return array.map({["prefix": $0.prefix, "replacement": $0.replacement]})
+  }
 }