对 Swift [UI] 中的 UserDefaults 感到疯狂

Eso*_*wes 4 swift userdefaults swiftui

开始使用 Swift 和 SwiftUI,我发现从 UIKit 迁移的过程非常困难。目前被 UserDefaults 跺脚,即使在尝试理解我在网上找到的许多教程之后也是如此。

请告诉我我在这里做错了什么:非常简单的代码:

  1. 将布尔值注册到 UserDefault,
  2. 在文本中显示该布尔值!

没有比这更简单的了。但我无法让它工作,因为对 UserDefaults 的调用会抛出此错误消息:

实例方法“appendInterpolation”要求“Bool”符合“_FormatSpecifiable”

我的“应用程序”是默认的单视图应用程序,有以下 2 处更改:

1- 在 AppDelegate 中,我注册了我的 bool :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UserDefaults.standard.register(defaults: [
    "MyBool 1": true
    ])


    return true
}
Run Code Online (Sandbox Code Playgroud)

2- 在 ContentView 中,我尝试显示它(在 struct ContentView: View 中):

let defaults = UserDefaults.standard

var body: some View {
    Text("The BOOL 1 value is : Bool 1 = \(defaults.bool(forKey: "MyBool 1"))")
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗 ?

谢谢

dan*_*dan 6

您的问题是Text(...)初始化程序采用 aLocalizedStringKey而不是 a String,它在其字符串插值中支持与普通字符串不同的类型(Bool显然不包括在内)。

有几种方法可以解决这个问题。

您可以使用Text带有 a的初始化程序String并逐字显示它,而无需尝试进行任何本地化:

var body: some View {
    Text(verbatim: "The BOOL 1 value is : Bool 1 = \(defaults.bool(forKey: "MyBool 1"))")
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以扩展LocalizedStringKey.StringInterpolation以支持 bool,然后您的原始代码应该可以工作:

extension LocalizedStringKey.StringInterpolation {
    mutating func appendInterpolation(_ value: Bool) {
        appendInterpolation(String(value))
    }
}
Run Code Online (Sandbox Code Playgroud)