首页 > 解决方案 > 筛选项列表 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)
                    }
                }


            }
        }

    }

标签: arraysswiftsortingclosuresswiftui

解决方案


您需要将所有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)
            }
        }
    }
}

推荐阅读