尝试使用泛型类型T的KeyPath在@ObservedObject的属性上指定绑定时,遇到编译器错误。
我正在尝试创建一个通用的SwiftUI视图,它将适用于具有相同类型的多个属性的类。SwiftUI视图需要是泛型的;但是,我无法确定如何创建到通过KeyPath访问的主对象的属性的绑定。下面的代码返回错误“类型为'T‘的值没有下标”
更新:我发现了代码中的错误,而不是$modelkeyPath: kp。我应该使用$modeldynamicMember: kp。
import SwiftUI
class TestClass: ObservableObject {
@Published public var str1: String = "one"
@Published public var str2: String = "two"
}
struct ContentView: View {
@ObservedObject var test = TestClass()
var body: some View {
VStack {
HStack{
Text("String One").padding(20)
StringView(model: test, kp: \TestClass.str1).padding(20)
}
HStack{
Text("String Two").padding(20)
StringView(model: test, kp: \TestClass.str2).padding(20)
}
}
}
}
struct StringView<T>: View where T: ObservableObject {
@ObservedObject var model: T
var kp: ReferenceWritableKeyPath<T,String>
init(model: T, kp: ReferenceWritableKeyPath<T,String>) {
self.model = model
self.kp = kp
}
var body: some View {
HStack{
TextField("String", text: $model[keyPath: kp]) <--- COMPILER ERROR HERE
Text(model[keyPath: kp])
}
}
}有可能做到这一点吗?
发布于 2019-09-18 14:47:06
我认为你可以用下面的代码来做。但我的想法有点冗长。
至少,TextField需要绑定器。所以KeyPath的目标类型应该是这样的。
class TestClass: ObservableObject {
@Published public var str1: String = "one"
@Published public var str2: String = "two"
}
struct _ContentView: View {
@ObservedObject var test = TestClass()
init() {
}
var body: some View {
VStack {
HStack{
Text("String One").padding(20)
StringView(model: test, kp: \ObservedObject<TestClass>.Wrapper.str1).padding(20)
}
HStack{
Text("String Two").padding(20)
StringView(model: test, kp: \ObservedObject<TestClass>.Wrapper.str2).padding(20)
}
}
}
}
struct StringView<T>: View where T: ObservableObject {
@ObservedObject var model: T
var kp: ReferenceWritableKeyPath<ObservedObject<T>.Wrapper, Binding<String>>
init(model: T, kp: ReferenceWritableKeyPath<ObservedObject<T>.Wrapper, Binding<String>>) {
self.model = model
self.kp = kp
}
var body: some View {
HStack{
TextField("String", text: $model[keyPath: kp])
Text($model[keyPath: kp].wrappedValue)
}
}
}https://stackoverflow.com/questions/57984819
复制相似问题