尝试实现搜索栏时出现 Swift 错误

Posted

技术标签:

【中文标题】尝试实现搜索栏时出现 Swift 错误【英文标题】:Swift error while trying to implement a search bar 【发布时间】:2021-07-29 19:45:39 【问题描述】:

我正在尝试在我的代码中实现搜索栏,但由于某种原因,我收到了错误,Failed to produce diagnostic for expression; please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the project,这仅在实现 if 语句时发生,但与 print 语句一起工作正常。 If语句有问题还是我使用错误?我希望它工作的方式是显示所有核心数据条目,除非在搜索栏中输入了某些内容(我假设在 If 语句中使用 or 语句来检查是否搜索 == "")并且是否输入了某些内容搜索栏仅显示名称属性包含搜索栏显示内容的条目。我正在使用 Xcode 12.5。任何帮助将不胜感激。

import SwiftUI

struct customers: View 
    @FetchRequest(entity: Customer.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Customer.name, ascending: true)]) var customered: FetchedResults<Customer>


@Environment(\.managedObjectContext) var moc

@State var search = String()
    
var body: some View 
    TextField("Search", text: $search)
    VStack
        HStack
            Text("Name")
        
        Group
            List(customered) that in 
               if(that.name?.lowercased().contains(search.lowercased()))
                Text(that.name ?? "unknown")
                    .onTapGesture 
                        if(that.shown)
                            that.shown = false
                        else
                            for shownVar in customered   
                                print(shownVar.name?.lowercased().contains(search.lowercased()))
                            
                        
                    
                
            
        
    

附:回想一下,这也需要很长时间来编译和加载,所以有没有更快更好的方法,因为在某一时刻它不会构建,因为它花费了太长时间并且据说要分解代码(这是一个更短的版本实际代码)。

【问题讨论】:

这是“你做错了什么,但我很困惑,我不确定到底是什么问题”的编译器。您应该首先注释掉部分,并确保注释掉平衡的大括号。在我开始评论之前我总是做一个 Re-Indent 可以找到 Editor: Structure: Re-Indent 或使用快捷键 Ctrl-I。如果没有Minimal, Reproducible Example,我们无论如何都无法诊断它。 另外,那个错误信息有一个非常具体的建议,而且 swift.org 有很多读者,所以遵循这个建议可能是一个非常好的主意。 【参考方案1】:

我认为问题是“that.name”可以为零,因此编译器无法理解该做什么。尝试这样的事情来实现你想要的:

                if search.isEmpty 
                    Text(that.name ?? "unknown")
                        .onTapGesture 
                            // ....
                        
                 else 
                    if ( (that.name ?? "").lowercased().contains(search.lowercased())) 
                        Text(that.name ?? "unknown")
                            .onTapGesture 
                                // ....
                            
                    
                

编辑:

为简洁起见,您可以使用以下内容:

struct CustomersView: View 
    @FetchRequest(entity: Customer.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Customer.name, ascending: true)]) var customered: FetchedResults<Customer>

    @Environment(\.managedObjectContext) var moc

    @State var search = String()

    var body: some View 
        TextField("Search", text: $search)
        VStack
            HStack
                Text("Name")
            
            Group
                List($customered, id: \.id)  $that in
                    if search.isEmpty 
                        TapableTextView(cust: $that)
                     else 
                        if ( (that.name ?? "").lowercased().contains(search.lowercased())) 
                            TapableTextView(cust: $that)
                        
                    
                
            
        
    

    

struct TapableTextView: View 
    @Binding var cust: customer
    
    var body: some View 
        Text(cust.name ?? "unknown")
            .frame(maxWidth: .infinity)
            .contentShape(Rectangle())
            .onTapGesture 
                    if(cust.shown)
                        cust.shown = false
                    
            
    

编辑 2:我刚刚注意到您使用的是 Xcode 12.5,在这种情况下,请尝试以下操作:

struct CustomersView: View 
    @FetchRequest(entity: Customer.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Customer.name, ascending: true)]) var customered: FetchedResults<Customer>
    
    @Environment(\.managedObjectContext) var moc
    
    @State var search = String()
    
    private func tapableText(_ ndx: Int) -> some View 
        Text(customered[ndx].name ?? "unknown")
            .frame(maxWidth: .infinity)
            .contentShape(Rectangle())
            .onTapGesture 
                if(customered[ndx].shown)
                    customered[ndx].shown = false
                
                print( "tapped on " + (customered[ndx].name ?? "unknown") )
            
    
    
    var body: some View 
        TextField("Search", text: $search)
        VStack
            HStack
                Text("Name")
            
            Group
                List(customered.indices, id: \.self)  ndx in
                    if search.isEmpty 
                        tapableText(ndx)
                     else 
                        if ( (customered[ndx].name ?? "").lowercased().contains(search.lowercased())) 
                            tapableText(ndx)
                        
                    
                
            
        
    

【讨论】:

以上是关于尝试实现搜索栏时出现 Swift 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中实现搜索栏

如何解决在 Django Ajax 中输入数据时出现 HTTP 403 错误?

在 tableview 上调用 selectRowAtIndexPath 时出现 Swift 错误

推送时出现大标题导航栏和搜索栏的错误

输入搜索栏文本框时出现 UISearchBar 错误

尝试下载文件时出现 Swift Alamofire 错误