arrays - 筛选项列表 SwiftUI
问题描述
我试图列出通过带有转义闭包的函数接收到的过滤器项目的结果。如果我在 Playground 中尝试该功能,它可以工作,所以现在我尝试在 SwiftUI 列表中使用它。
但是Xcode给了我警告......
无法将类型“()”的值转换为闭包结果类型“_”
这是我的搜索功能
typealias exit = (([AirportModel]) -> ())
func filter (valoreSearhed: String, arrayTosearh: [AirportModel], closure: @escaping exit) {
DispatchQueue.global().async {
let aeroportoFiltrato = arrayTosearh.filter { $0.aptICAO.localizedCaseInsensitiveContains(valoreSearhed) }
closure(aeroportoFiltrato)
}
}
这是我的清单
var body: some View {
VStack {
// fakebar
SearchBar(text: $searchTerm)
List {
dm.filter(valoreSearhed: searchTerm, arrayTosearh: dm.airportVector) { (item) in
ForEach(item) { valore in
Text(valore.aptICAO)
}
}
}
}
}
解决方案
您需要将所有View
元素保留在同一个线程中,无需分派。
因此,将您的过滤器功能更改为:
func filter (valoreSearhed: String, arrayTosearh: [AirportModel]) -> [AirportModel] {
return arrayTosearh.filter { $0.aptICAO.localizedCaseInsensitiveContains(valoreSearhed) }
}
然后你的View
代码:
List {
ForEach(dm.filter(valoreSearhed: searchTerm, arrayTosearh: dm.airportVector)) { valore in
Text(valore.aptICAO)
}
}
编辑
要在另一个线程中进行过滤,请保留一个@State
带有结果的 var:
@State var filteredAirports: [AirportModel] = []
init() {
dm.filter( ... ) {
self.filteredAirports = $0
}
}
var body: some View {
VStack {
List {
ForEach(filteredAirports) { valore in
Text(valore.aptICAO)
}
}
}
}
推荐阅读
- swift - 在长时间任务期间正确使用 Dispatch 来显示活动指示器
- java - Firebase“OnCompleteListener”总是返回成功
- database - 休眠:如何保持子对象而不是在休眠中触摸/更新父对象
- javascript - 移动设备上的垂直滚动 fullpage.js
- ruby-on-rails - 如何允许通过 ajax 和 http 库调用我的 REST API 端点?
- c - “状态:系统中打开的文件太多”打开和锁定
- reactjs - materialUI 在不使用 withStyles 的情况下获取类名
- three.js - 三 JS - GLTF 模型暗
- wpf - 将数据项值设置为 Datagrid 中的标记属性
- vue.js - webpack vuejs/如何仅在开发模式下导入模块并在生产模式下忽略它?