如何解决如何使自定义属性包装器可以与@State进行绑定?
我创建了一个自定义属性包装程序,该属性包装程序以文件的setter和getter的形式读写文件。
@EnableMongoRepositories
我现在想像在设置视图中那样使用它:
@propertyWrapper struct Specifier<Value> {
let key: String
let defaultValue: Value
let plistPath: String
var prefs: NSDictionary {
NSDictionary(contentsOfFile: plistPath) ?? NSDictionary()
}
var wrappedValue: Value {
get {
return prefs.value(forKey: key) as? Value ?? defaultValue
}
set {
prefs.setValue(newValue,forKey: key)
prefs.write(toFile: plistPath,atomically: true)
}
}
}
出现以下错误:
struct PrefsView: View {
@Specifier<Bool>(key: "enable",defaultValue: true,plistPath: "/Library/path/to/Prefs.plist") private var enable
var body: some View {
Form {
Toggle("Enable",isOn: $enable)
}
}
}
我如何实现写入和读取文件以设置和获取变量但还允许其绑定到值的这种效果?
注意:我的项目不需要是“ App Store Legal”
解决方法
您的属性包装器返回Bool
所需的Binding<Bool>
而不是Toggle
。
您可以指定projectedValue
(如NewDev所建议)-这将允许您使用Binding
访问$
:
@propertyWrapper struct Specifier<Value> {
...
var wrappedValue: Value {
get {
projectedValue.wrappedValue
}
set {
projectedValue.wrappedValue = newValue
}
}
var projectedValue: Binding<Value> {
.init(get: {
prefs.value(forKey: key) as? Value ?? defaultValue
},set: {
prefs.setValue($0,forKey: key)
prefs.write(toFile: plistPath,atomically: true)
})
}
}
struct ContentView: View {
@Specifier(key: "enable",defaultValue: true,plistPath: "/Library/path/to/Prefs.plist") private var enable
var body: some View {
Form {
Toggle("Enable",isOn: $enable)
Text(String(enable))
}
}
}
或者,您可以将wrappedValue
的返回类型更改为Binding<Bool>
:
@propertyWrapper struct Specifier<Value> {
...
var wrappedValue: Binding<Value> {
.init(get: {
prefs.value(forKey: key) as? Value ?? defaultValue
},isOn: enable) // access as a Binding
Text(String(enable.wrappedValue)) // access as a Bool
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。