SwiftUI @AppStorage使用依赖实例属性的动态Key报错如何解决?
解决方案
核心思路是将@AppStorage属性的初始化逻辑从属性声明处移到视图的自定义构造器中执行,即可拼接动态生成的存储Key,完整实现代码如下:
import SwiftUI struct ProductDetail: View { var product: GumroadProduct // 只声明属性,不在此处完成初始化 @AppStorage var isLocal: Bool // 自定义构造器 init(product: GumroadProduct) { self.product = product // 动态生成存储Key let dynamicKey = "LOCAL_LIBRARY_PRESENCE_PRODUCTID_\(product.id)" // 初始化@AppStorage属性包装器实例 self._isLocal = AppStorage(wrappedValue: false, dynamicKey) } var body: some View { Text("ProductView") } }
原理说明
- Swift中
@开头的属性包装器,底层实际存储的实例对应变量名是_+属性名,这里就是_isLocal - 我们在自定义构造器中先给
product赋值,再拼接出动态Key,最后初始化_isLocal,全程不需要访问未构造完成的self,自然不会触发原报错 - 该方案完全保留了
@AppStorage的响应式特性,存储值变动时会自动刷新视图,兼容所有支持@AppStorage的系统版本(iOS 14+/macOS 11+)
如果需要使用自定义的UserDefaults套件,只需要在初始化AppStorage时增加store参数即可:
self._isLocal = AppStorage(wrappedValue: false, dynamicKey, store: UserDefaults(suiteName: "你的套件ID"))
内容的提问来源于stack exchange,提问作者Albifer
相关产品推荐
相关产品推荐

