如果存在用户默认值,则更新@Published var swift

Updating @Published var if a userdefault value is present swift

我正在尝试检查我的应用程序,看看用户默认值中是否存在某个值,如果存在,它们将被应用到应用程序中。如果它不存在,他们需要在那里输入密码,然后进入应用程序。

知道如何检查用户默认值中是否存在值,然后将 isValidated 更改为 true

//主要

import SwiftUI
@main
struct ProjectHogtieApp: App {
    @StateObject var authentication = Authentication()
    var body: some Scene {
        WindowGroup {
            if authentication.isValidated {
                ContentView()
                    .environmentObject(authentication)
            } else {
                LoginView()
                    .environmentObject(authentication)
            } 
        }
    }
}

// authentiction.swift

class Authentication: ObservableObject {
    
    @Published var isValidated = false
    
    // this code is not working.
    var getIsValidated: Void {
        let deviceId = UserDefaults.standard.string(forKey: "deviceId")
        if (deviceId != nil) {
            self.isValidated = true
        } else {
            self.isValidated = false
        }
    }

当用户输入 pin 时,我将值保存在用户默认值中,如下所示

let defaults = UserDefaults.standard
defaults.set(deviceId, forKey: "deviceId")

试试这个,在应用程序启动时检查您的 UserDefaults(即创建 Authentication 时):

class Authentication: ObservableObject {
    
    @Published var isValidated = false
    
    // --- here
    init() {
        getIsValidated
    }
  //....

请注意,对于身份验证等重要事项...您应该使用 Keychain 来安全地保存数据,而不是 UserDefaults

您可以继续沿着您要走的路前进。但是,SwiftUI 中存在一个 属性 包装器,称为 AppStorage。这本质上是一个方便的包装器,用于在 UserDefaults 中获取和设置值。在这种情况下,您可能会像这样使用它...

import SwiftUI

@main
struct ProjectHogtieApp: App {

    @AppStorage("isAuthenticated") private var isAuthenticated: Bool = false

    var body: some Scene {
        WindowGroup {
            if isAuthenticated {
                ContentView()
            } else {
                LoginView()
            } 
        }
    }
}

属性包装器采用的参数是您的键,您提供的值是默认值,但会被UserDefaults中的任何现有值覆盖。