代码之家  ›  专栏  ›  技术社区  ›  swiftnoob

无法将“FetchedResults<>”类型的返回表达式转换为返回类型“[String]”

  •  0
  • swiftnoob  · 技术社区  · 2 年前

    我试图按存储在核心数据中的名称搜索书签列表,但在var searchResults中的“return items”旁边出现了这个错误

    “无法将“FetchedResults<MyBookmark”类型的返回表达式转换为返回类型“[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 { $0.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应用

    1 回复  |  直到 2 年前
        1
  •  0
  •   HunterLion    2 年前

    该var必须返回一个 String ,但您正在返回数组 items ,这是一个类型为 MyBookmark .

    解决方案:将数组转换为 [String] .

    将该变量替换为:

             var searchResults: [String] {
                if searchText.isEmpty {
                   return items.compactMap { $0.name }
              } else {
                  return items.compactMap { $0.name }.filter { $0.localizedCaseInsensitiveContains(searchText) }
                }
             }