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
...
如果allItems
是Expression
的常规数组,我会这样做
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 正确的类型,它也可以直接在您的视图中使用。
我在 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
...
如果allItems
是Expression
的常规数组,我会这样做
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 正确的类型,它也可以直接在您的视图中使用。