无法将类型 '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)
}