SwiftUI如何将层级文件夹结构的Item展平为扁平列表?
实现可搜索的扁平Item列表方案
1. 给Folder添加递归收集所有Item的扩展
不用修改原有数据结构,只需给Folder加一个扩展,通过递归+flatMap快速生成所有子文件夹Item的扁平数组:
extension Folder { // 递归收集当前文件夹及所有子文件夹的Item var allItems: [Item] { items + children.flatMap { $0.allItems } } }
这里flatMap会自动将每个子文件夹的allItems数组展开并合并,比手动循环递归更简洁高效。
2. 实现带搜索功能的扁平列表View
利用SwiftUI原生的searchable修饰符结合过滤逻辑,快速搭建可搜索列表:
struct FlatItemsListView: View { let rootFolder: Folder @State private var searchKeyword = "" // 根据搜索关键词过滤Item private var filteredItems: [Item] { guard !searchKeyword.isEmpty else { return rootFolder.allItems } return rootFolder.allItems.filter { item in // 这里假设Item有label属性用于搜索,可根据实际字段修改匹配逻辑 item.label.localizedCaseInsensitiveContains(searchKeyword) } } var body: some View { NavigationStack { List(filteredItems) { item in // 替换成你的Item行视图 Text(item.label) } .navigationTitle("全部项目") .searchable(text: $searchKeyword, prompt: "搜索项目") } } }
补充说明
- 这种方案完全保留了你原有的
Folder和Item数据结构,无需统一嵌套类型。 - 递归逻辑被封装在
Folder扩展中,View层只需调用allItems即可,代码解耦且易维护。 - 搜索功能基于SwiftUI原生API实现,无需额外引入第三方库。
内容的提问来源于stack exchange,提问作者Ashwin Iyengar
相关产品推荐
相关产品推荐

