web-dev-qa-db-ja.com

@Stateをパブリッシャーに変換する

UIと値の計算の両方に@State変数を使用したいと思います。

たとえば、TextField@State var userInputURL: String = "https://"にバインドされているとします。 userInputURLmapURLできるように、それをパブリッシャーに接続するにはどうすればよいですか。

疑似コード:

$userInputURL.publisher()
      .compactMap({ URL(string: $0) })
      .flatMap({ URLSession(configuration: .ephemeral).dataTaskPublisher(for: $0).assertNoFailure() })
      .eraseToAnyPublisher()
9
Ryan

@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()
            }
        }
    }
}
5
Mecid