SwiftUI - 使一个变量与另一个变量相同

SwiftUI - making a variable the same kind of the other one

我在 SwiftUI 中有一个由核心数据填充的列表,我正在尝试过滤该列表。

所以我有了这个核心数据实体class...

@objc(Expression)
public class Expression: NSManagedObject, Identifiable {

}

extension Expression {
    
  @NSManaged public var term: String?
  @NSManaged public var description: String?
  @NSManaged public var excerpt: String?
 
   
  static func getAllItemsRequest() -> NSFetchRequest< Expression > {
    let request: NSFetchRequest<Expression> = Expression.fetchRequest() as! NSFetchRequest<Expressao>
    request.returnsDistinctResults = true
    
    let sortDescriptor = NSSortDescriptor(key: "term", ascending: true)
    request.sortDescriptors = [sortDescriptor]
    return request
  }

我有这个列表视图:

struct FilteredList: View {
  
  @Environment(\.managedObjectContext) private var coreDataContext

  @FetchRequest(fetchRequest: Expression.getAllItemsRequest())
  private var allItems: FetchedResults<Expression>

现在我想创建一个计算变量来过滤 allItems...

如果allItemsExpression的常规数组,我会这样做

var filteredItems:[Expression] {
    allItems.filter {(item) -> Bool in
      searchText.isEmpty ? true : matchSearch(expression:item)
    }
}

但是因为filteredItems必须是同类型的allItems,我想我得写成

var filteredItems:FetchedResults<Expression> {
    allItems.filter {(item) -> Bool in
      searchText.isEmpty ? true : matchSearch(expression:item)
    }
}

如果我这样做,我会在过滤器行上收到错误消息:

Cannot convert return expression of type '[FetchedResults<Expression>.Element]' (aka 'Array<Expression>') to return type 'FetchedResults<Expression>'

我该怎么做?

Cannot convert return expression of type
'[FetchedResults<Expression>.Element]' (aka 'Array<Expression>') to
return type 'FetchedResults<Expression>'

此错误表明您的 filteredItems 函数已经 return 是一个 Expression 类型的元素数组(但您尝试强制执行 non-matching return类型):

var filteredItems:FetchedResults<Expression> {
    allItems.filter {(item) -> Bool in
      searchText.isEmpty ? true : matchSearch(expression:item)
    }
}

那你为什么要它是 FetchedResults<Expression> 类型?

如果您打算在您的视图中使用此计算 属性(例如,在某些 ForEach 中),您只需将 return 类型更改为 [Expression]

var filteredItems: [Expression] {
    allItems.filter { item in
      searchText.isEmpty ? true : matchSearch(expression: item)
    }
}

这样您将 return 正确的类型,它也可以直接在您的视图中使用。