我想在UI和计算值中都使用一个@State
变量。
例如,假设我有一个绑定到TextField
的{{1}}。我将如何使用该@State var userInputURL: String = "https://"
并将其连接到发布商,以便可以将userInputURL
插入map
。
伪代码:
URL
答案 0 :(得分:5)
您不能将@state转换为发布者,但是可以使用ObservableObject。
import SwiftUI
final class SearchStore: ObservableObject {
@Published var query: String = ""
func fetch() {
$query
.map { URL(string: $0) }
.flatMap { URLSession.shared.dataTaskPublisher(for: $0) }
.sink { print($0) }
}
}
struct ContentView: View {
@ObservedObject var store = SearchStore()
var body: some View {
VStack {
TextField("type something...", text: $store.query)
Button("search") {
self.store.fetch()
}
}
}
}
答案 1 :(得分:-1)
最新的beta已更改了变量的发布方式,因此我什至不希望您尝试。制作ObservableObject类非常容易,但是您随后想要添加一个供自己使用的发布者:
class ObservableString: Combine.ObservableObject, Identifiable {
let id = UUID()
let objectWillChange = ObservableObjectPublisher()
let publisher = PassthroughSubject<String, Never>()
var string: String {
willSet { objectWillChange.send() }
didSet { publisher.send(string) }
}
init(_ string: String = "") { self.string = string }
}
请使用@State
而不是@ObservableObject
变量,并记住直接访问属性字符串,而不要使用@State所使用的魔术。