将@State转换为发布者

Rya*_*yan 8 swift swiftui combine

我想@State在UI和计算值中都使用变量。

例如,假设我有一个TextField约束@State var userInputURL: String = "https://"。我将如何处理并将其userInputURL连接到发布商,以便将map其集成到URL

伪代码:

$userInputURL.publisher()
      .compactMap({ URL(string: $0) })
      .flatMap({ URLSession(configuration: .ephemeral).dataTaskPublisher(for: $0).assertNoFailure() })
      .eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)

Mec*_*cid 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()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)