在哪里放置 .register() 方法来为 UserDefaults 设置 initial/default 值?

Where to place the .register() method to set an initial/default value for UserDefaults?

我目前正在努力找出正确放置 .register() 方法的位置,以便为 UserDefaults 设置 initial/default 值(在每次启动应用程序时)。

这里是我尝试在 Xcode 随项目生成的“App”文件中初始化它的地方:

import SwiftUI

@main
struct TestApp: App {

    init() {
        //Sets default values for the user defaults that have not yet been set and should not return 0/false
        UserDefaults.standard.register(defaults: [
                "selectedRoundLength": 1
            ]
        )
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

但是,这似乎并不能真正解决问题。有人对此有意见吗?

如果您的最低目标是 iOS 14,您可以使用 @AppStorage 将您的值保存在 UserDefaults 中并从初始值开始。您不需要特别在 @main 中添加此 @AppStorage 值来初始化它。您可以在任何 SwiftUI 视图或 Observable class 中真正需要它的地方调用它。如果 none 已保存,它将具有此初始值。

import SwiftUI

@main
struct TestApp: App {

  // This is UserDefaults starting in iOS 14.
  @AppStorage("selectedRoundLength") var selectedRoundLength = 1

  var body: some Scene {
    WindowGroup {
      ContentView()
    }
  }
}

这个 initUIApplication 设置之前被调用,所以如果你想注册默认值(可以从大字典的 plist 完成)它应该通过应用程序委托适配器完成.

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {

        // Register defaults here !!
        UserDefaults.standard.register(defaults: [
                "selectedRoundLength": 1
                // ... other settings
            ]
        )

        return true
    }
}

@main
struct TestApp: App {

    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}