使用非零值初始化可选的 @AppStorage 属性

Posted

技术标签:

【中文标题】使用非零值初始化可选的 @AppStorage 属性【英文标题】:Initialize optional @AppStorage property with non-nil value 【发布时间】:2021-10-26 16:25:17 【问题描述】:

我需要一个可选的@AppStorage String 属性(对于NavigationLink 选择,它需要可选),所以我声明了

@AppStorage("navItemSelected") var navItemSelected: String?

我需要它以非零的默认值开始,所以我尝试了:

@AppStorage("navItemSelected") var navItemSelected: String? = "default"

但这不会编译。

我也试过了:

init() 
    if navItemSelected == nil  navItemSelected = "default" 

但这只是在应用启动时覆盖实际的持久值。

有没有办法用默认的非零值启动它,然后让它像往常一样持续存在?

【问题讨论】:

Optional 不是 plist 类型,因此无法存储在 AppStorage 中,您需要在 NavigationLink 端解决此问题,例如引入内联 Binding 检查 AppStorage 的条件值。 【参考方案1】:

这是一个基于内联 Binding 的可能方法的简单演示(我在上面的评论的后续)。

使用 Xcode 13 / ios 15 测试

struct DemoAppStoreNavigation: View 
    static let defaultNav = "default"
    @AppStorage("navItemSelected") var navItemSelected = Self.defaultNav

    var body: some View 
        NavigationView 
            Button("Go Next") 
                navItemSelected = "next"
            .background(
                NavigationLink(isActive: Binding(
                    get:  navItemSelected != Self.defaultNav ,
                    set:  _ in 
                ), destination: 
                    Button("Return") 
                        navItemSelected = Self.defaultNav
                    
                    .onDisappear 
                        navItemSelected = Self.defaultNav   // << for the case of `<Back`
                    
                )  EmptyView() 
            )
        
    

【讨论】:

【参考方案2】:

@AppStorageUserDefaults 的包装器,因此您可以简单地以老式方式注册一个默认值:

UserDefaults.standard.register(defaults: ["navItemSelected" : "default"])

您需要在视图加载之前调用register(defaults:),因此我建议您在应用的初始化或application(_:didFinishLaunchingWithOptions:) 中调用它。

【讨论】:

以上是关于使用非零值初始化可选的 @AppStorage 属性的主要内容,如果未能解决你的问题,请参考以下文章

Python流程控制语句

在 TensorFlow 中,如何使用 python 从张量中获取非零值及其索引?

仅评估 tf.Tensor 的非零值

英特尔 SIMD - 如何检查 __m256* 是不是包含任何非零值

如何计算sql中包含非零值的行

用先前的非零值替换向量中的所有零