Arrays 筛选项SwiftUI的列表

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

我试图列出通过带有转义闭包的函数接收的筛选器项的结果。 如果我在操场上尝试这个功能,它会工作,所以现在我尝试在SwiftUI列表中使用它

但是Xcode给我一个警告

无法将类型“()”的值转换为闭包结果类型“\u1”

这里是我的搜索功能

 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()