将@State转换为发布者

时间:2019-07-04 01:56:23

标签: swift swiftui combine

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

例如,假设我有一个绑定到TextField的{​​{1}}。我将如何使用该@State var userInputURL: String = "https://"并将其连接到发布商,以便可以将userInputURL插入map

伪代码:

URL

2 个答案:

答案 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所使用的魔术。