尝试实现搜索栏时出现 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 错误的主要内容,如果未能解决你的问题,请参考以下文章
如何解决在 Django Ajax 中输入数据时出现 HTTP 403 错误?