无法将类型 'FetchedResults<>' 的 return 表达式转换为 return 类型“[String]”
Cannot convert return expression of type 'FetchedResults<>' to return type '[String]'
我正在尝试按存储在 Core Data 中的名称搜索书签列表,但我在 var searchResults
中的 'return items' 旁边收到此错误
“无法转换 return 类型 'FetchedResults <MyBookmark to return type '[String]' 的表达式”
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \MyBookmark.name, ascending: true)], animation: .default)
private var items: FetchedResults<MyBookmark>
@State private var searchText = ""
ForEach(searchResults, id: \.self) { myBookmark in
Text(myBookmark.name!)
Text(myBookmark.url!)
}
.searchable(text: $searchText)
var searchResults: [String] {
if searchText.isEmpty {
return items
} else {
return items.filter { [=13=].localizedCaseInsensitiveContains(searchText) }
}
}
我的书签
@objc(MyBookmark)
public class MyBookmark: NSManagedObject, BaseModel {
static var all: NSFetchRequest<MyBookmark> {
let request: NSFetchRequest<MyBookmark> = MyBookmark.fetchRequest()
request.sortDescriptors = []
return request
}
}
extension MyBookmark {
@nonobjc public class func fetchRequest() -> NSFetchRequest<MyBookmark> {
return NSFetchRequest<MyBookmark>(entityName: "MyBookmark")
}
@NSManaged public var name: String?
@NSManaged public var url: String?
}
extension MyBookmark : Identifiable {
}
这适用于 macOS 应用程序
那个 var 必须 return 一个 String
的数组,但是你 return 正在 items
数组,它是一个 MyBookmark
类型的数组.
解决方法:将数组转换为[String]
.
类型
将该变量替换为:
var searchResults: [String] {
if searchText.isEmpty {
return items.compactMap { [=10=].name }
} else {
return items.compactMap { [=10=].name }.filter { [=10=].localizedCaseInsensitiveContains(searchText) }
}
}
当搜索过滤器发生变化时,您需要重新执行您的提取请求。为此,您需要设置获取请求的谓词。
添加一个新的 属性 来处理这个问题
var query: Binding<String> {
Binding {
searchText
} set: { newValue in
searchText = newValue
if newValue.isEmpty {
items.nsPredicate = NSPredicate(value: true)
} else {
items.nsPredicate = NSPredicate(format: "name CONTAINS[cd] %@", newValue) }
}
}
然后将 .searchable
修饰符与 属性
一起使用
var body: some View {
ForEach {
//...
}
.searchable(text: query)
}
我正在尝试按存储在 Core Data 中的名称搜索书签列表,但我在 var searchResults
中的 'return items' 旁边收到此错误“无法转换 return 类型 'FetchedResults <MyBookmark to return type '[String]' 的表达式”
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \MyBookmark.name, ascending: true)], animation: .default)
private var items: FetchedResults<MyBookmark>
@State private var searchText = ""
ForEach(searchResults, id: \.self) { myBookmark in
Text(myBookmark.name!)
Text(myBookmark.url!)
}
.searchable(text: $searchText)
var searchResults: [String] {
if searchText.isEmpty {
return items
} else {
return items.filter { [=13=].localizedCaseInsensitiveContains(searchText) }
}
}
我的书签
@objc(MyBookmark)
public class MyBookmark: NSManagedObject, BaseModel {
static var all: NSFetchRequest<MyBookmark> {
let request: NSFetchRequest<MyBookmark> = MyBookmark.fetchRequest()
request.sortDescriptors = []
return request
}
}
extension MyBookmark {
@nonobjc public class func fetchRequest() -> NSFetchRequest<MyBookmark> {
return NSFetchRequest<MyBookmark>(entityName: "MyBookmark")
}
@NSManaged public var name: String?
@NSManaged public var url: String?
}
extension MyBookmark : Identifiable {
}
这适用于 macOS 应用程序
那个 var 必须 return 一个 String
的数组,但是你 return 正在 items
数组,它是一个 MyBookmark
类型的数组.
解决方法:将数组转换为[String]
.
将该变量替换为:
var searchResults: [String] {
if searchText.isEmpty {
return items.compactMap { [=10=].name }
} else {
return items.compactMap { [=10=].name }.filter { [=10=].localizedCaseInsensitiveContains(searchText) }
}
}
当搜索过滤器发生变化时,您需要重新执行您的提取请求。为此,您需要设置获取请求的谓词。
添加一个新的 属性 来处理这个问题
var query: Binding<String> {
Binding {
searchText
} set: { newValue in
searchText = newValue
if newValue.isEmpty {
items.nsPredicate = NSPredicate(value: true)
} else {
items.nsPredicate = NSPredicate(format: "name CONTAINS[cd] %@", newValue) }
}
}
然后将 .searchable
修饰符与 属性
var body: some View {
ForEach {
//...
}
.searchable(text: query)
}