UIと値の計算の両方に@State
変数を使用したいと思います。
たとえば、TextField
が@State var userInputURL: String = "https://"
にバインドされているとします。 userInputURL
をmap
にURL
できるように、それをパブリッシャーに接続するにはどうすればよいですか。
疑似コード:
$userInputURL.publisher()
.compactMap({ URL(string: $0) })
.flatMap({ URLSession(configuration: .ephemeral).dataTaskPublisher(for: $0).assertNoFailure() })
.eraseToAnyPublisher()
@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()
}
}
}
}