首页 > 解决方案 > 将 @State 转换为 Publisher

问题描述

我想@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()

标签: swiftswiftuicombine

解决方案


您不能将 @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 {
    @StateObject var store = SearchStore()

    var body: some View {
        VStack {
            TextField("type something...", text: $store.query)
            Button("search") {
                self.store.fetch()
            }
        }
    }
}

推荐阅读