我知道State包装器是为了View而设计的,但我想尝试构建和测试一些代码是否可行,我的目标只是为了学习目的。
我的代码有两个大问题!
Xcode无法找到T。
如何初始化我的状态?
import SwiftUI
var state: State<T> where T: StringProtocol = State(get: { state }, set: { newValue in state = newValue })
struct ContentView: View {
var body: some View {
Text(state)
}
}
更新:我可以在这里为绑定执行相同的操作,现在我想使用上面的代码来处理状态。
import SwiftUI
var state2: String = String() { didSet { print(state2) } }
var binding: Binding = Binding.init(get: { state2 }, set: { newValue in state2 = newValue })
struct ContentView: View {
var body: some View {
TextField("Enter your text", text: binding)
}
}
如果我能找到解决我的问题的答案,那么我就可以在视图之外定义我的状态和绑定,这项工作已经完成了50%,还需要50%的状态包装器。
新更新:
import SwiftUI
var state: State<String> = State.init(initialValue: "Hello") { didSet { print(state.wrappedValue) } }
var binding: Binding = Binding.init(get: { state.wrappedValue }, set: { newValue in state = State(wrappedValue: newValue) })
struct ContentView: View {
var body: some View {
Text(state) // <<: Here is the issue!
TextField("Enter your text", text: binding)
}
}
T
?目前你的T
受到了stringProtocol
的限制,但是你如何满足 T 的具体类型呢?T 不知道要与谁通信。另外,你正在将State<String>
传递给 Text,这是不正确的。还有一件事,与绑定不同,State
的初始化器没有 get 和 set @escaping 块。 - Tushar SharmaState
对象,例如var state = State(wrappedValue: “foo”)
,并且你可以在视图内使用projectedValue
作为Binding
,使用wrapped
值来访问实际值。这是一种不需要泛型的方法。是否必须使用泛型? - Tushar Sharma