SwiftUI 搜索栏 - 请帮助我简化我的代码

SwiftUI Search bar - Please help my simplify my code

又是一个新手问题。 我在我的应用程序中实现了搜索功能。但是我对我的代码很不满意。我知道我必须将我的 searchText 放入 .searchable() {...} 但是在不同教程的帮助下,我的知识还不足以做到这一点。 你能不能看看我的代码并给我一个提示,以便我可以从你的解决方案中学习?

//
//  FavoriteView.swift
//  Blindzeln_Prototyp
//
//  Created by Michael Ecke on 25.01.22.
//

import SwiftUI

struct FavoriteView: View {
    
    @EnvironmentObject var blindzeln: BLINDzeln
    @State private var searchText = ""
    
    var body: some View {
        
        NavigationView {
            List{
                ForEach(blindzeln.favorites, id: \.entryID) { item in
                    
                    if searchText==""{
                    
                    NavigationLink(destination: FavoriteDetailView(item: item)) {
                        VStack(alignment: .leading, spacing: 20.0) {
                            Text(item.title)
                                .font(.largeTitle)
                                .foregroundColor(.primary)
                            Text(item.textBody)
                                .font(.body)
                                .foregroundColor(.secondary)
                                .lineLimit(2)
                            BigDivider()
                        }
                    }.listRowSeparatorTint(.primary)
                        .listRowSeparator(.hidden)
                }
                else {
                    if item.title.localizedCaseInsensitiveContains(searchText) || item.textBody.localizedCaseInsensitiveContains(searchText){
                        NavigationLink(destination: FavoriteDetailView(item: item)) {
                            VStack(alignment: .leading, spacing: 20.0) {
                                Text(item.title)
                                    .font(.largeTitle)
                                    .foregroundColor(.primary)
                                Text(item.textBody)
                                    .font(.body)
                                    .foregroundColor(.secondary)
                                    .lineLimit(2)
                                BigDivider()
                            }
                        }.listRowSeparatorTint(.primary)
                            .listRowSeparator(.hidden)
                    }
                }
                
                }
                .onDelete(perform: delete)
                .onMove(perform: onMove)
            }
            .searchable(text: $searchText) {}
            ```

如果没有其余代码进行测试,我无法确定,但您应该能够像这样压缩代码:

struct FavoriteView: View {
    
    @EnvironmentObject var blindzeln: BLINDzeln
    @State private var searchText = ""
    
    var body: some View {
        
        NavigationView {
            List{
                ForEach(blindzeln.favorites.filter { searchText.isEmpty ||([=10=].title.localizedCaseInsensitiveContains(searchText) || [=10=].textBody.localizedCaseInsensitiveContains(searchText)) }, id: \.entryID){ item in
                    NavigationLink(destination: FavoriteDetailView(item: item)) {
                        VStack(alignment: .leading, spacing: 20.0) {
                            Text(item.title)
                                .font(.largeTitle)
                                .foregroundColor(.primary)
                            Text(item.textBody)
                                .font(.body)
                                .foregroundColor(.secondary)
                                .lineLimit(2)
                            BigDivider()
                        }
                    }.listRowSeparatorTint(.primary)
                        .listRowSeparator(.hidden)
                }
            }
            .onDelete(perform: delete)
            .onMove(perform: onMove)
        }
        .searchable(text: $searchText) {}
        // Nothing changed past here...
    }
}

基本上我设置的过滤器是这样的:

  1. 如果 searchText 为空,return TRUE,则使用该项目;
  2. 如果 searchText 不为空,则计算 OR 的另一侧,即 2 个带 OR 的条件。如果 titletextBody 包含 searchText,return TRUE,则使用项目;
  3. 如果所有内容 return 都是错误的,请不要使用项目。

最后一件事,将模型结构中的 entryID 重命名为 id,使模型结构符合 Identifiable,然后是 ForEach(省略.filter 可以是这样的:

ForEach(blindzeln.favorites) { item in

作为 Identifiable 结构不需要在 ForEach 初始化器中使用 id: