Arrays 筛选项SwiftUI的列表
我试图列出通过带有转义闭包的函数接收的筛选器项的结果。 如果我在操场上尝试这个功能,它会工作,所以现在我尝试在SwiftUI列表中使用它 但是Xcode给我一个警告 无法将类型“()”的值转换为闭包结果类型“\u1” 这里是我的搜索功能Arrays 筛选项SwiftUI的列表,arrays,swift,sorting,closures,swiftui,Arrays,Swift,Sorting,Closures,Swiftui,我试图列出通过带有转义闭包的函数接收的筛选器项的结果。 如果我在操场上尝试这个功能,它会工作,所以现在我尝试在SwiftUI列表中使用它 但是Xcode给我一个警告 无法将类型“()”的值转换为闭包结果类型“\u1” 这里是我的搜索功能 typealias exit = (([AirportModel]) -> ()) func filter (valoreSearhed: String, arrayTosearh: [AirportModel], closure: @esc
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)
}
}
}
}
}
您需要将所有
视图
元素保持在同一个线程中,而不进行分派
因此,将过滤器功能更改为:
func过滤器(从价搜索:字符串,数组搜索:[AirportModel])->[AirportModel]{
返回arrayTosearh.filter{$0.aptICAO.localizedCaseInsensitiveContains(valoreSearhed)}
}
然后您的视图
代码将:
列表{
ForEach(dm.filter(valoreSearhed:searchTerm,arrayTosearh:dm.airportVector)){valorein
文本(valore.aptICAO)
}
}
编辑
要在另一个线程中进行筛选,请保留一个带有结果的@State
var:
@State var filteredAirports:[AirportModel]=[]
init(){
dm.filter(…){
self.filterDairPorts=$0
}
}
var body:一些观点{
VStack{
名单{
ForEach(filteradairports){valore in
文本(valore.aptICAO)
}
}
}
}
理解。。。问题是我需要在另一个线程中进行搜索,因为我搜索的向量非常大,所以需要一个带有结果的@State
var。然后,您可以让它在结果到达时更新视图。请参见上面的补充答案。我更改了删除闭包的函数,并放置了您的闭包。我在init()init(){dm.filter(valoreSearhed:searchTerm,arrayTosearh:dm.airportVector){self.filteredAirports=$0}上收到一条警告
是的,它是YourView.init()
。