使用非零值初始化可选的 @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】:@AppStorage
是UserDefaults
的包装器,因此您可以简单地以老式方式注册一个默认值:
UserDefaults.standard.register(defaults: ["navItemSelected" : "default"])
您需要在视图加载之前调用register(defaults:)
,因此我建议您在应用的初始化或application(_:didFinishLaunchingWithOptions:)
中调用它。
【讨论】:
以上是关于使用非零值初始化可选的 @AppStorage 属性的主要内容,如果未能解决你的问题,请参考以下文章
在 TensorFlow 中,如何使用 python 从张量中获取非零值及其索引?