swift - 将 @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()
解决方案
您不能将 @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()
}
}
}
}
推荐阅读
- node.js - 某些 Node.js 版本上的 TypeScript“找不到声明文件”错误
- c# - C# 我需要我的程序第一次以管理员身份启动,而不是以普通用户身份启动
- c++ - 进行 cin 时检查用户 Internet 连接
- c# - 删除具有外键约束的记录
- java - 如何在 Visual Studio 代码中导入包?
- android - Android Room:是否可以在实体中使用有界类型参数?
- cpprest-sdk - 从 cpprest sdk pplx 任务 cpp 捕获 json 响应值和 http 状态到局部变量
- c++ - c ++迭代对象列表并删除对象
- javascript - 如何使用Javascript在二叉搜索树中找到最长的路径?
- vba - 根据提供的数字逐步执行单个排列顺序