我尝试使用一个函数对Core Data中的数据进行排序,并根据 predicate 获取第一个元素的firstIndex
,但当我使用.firstIndex
时,它显示:
类型“((文件详细信息)-〉数组.索引?)?”(也称为“可选〈(文件详细信息)-〉可选〉”)的值没有成员“compactMap”“
func countingLastOccurrence(filterkey1: String) -> Int {
let context = PersistenceController.shared.container.viewContext
let fetchquest1 = NSFetchRequest<Filedetails>(entityName: "Filedetails")
fetchquest1.sortDescriptors = [NSSortDescriptor(keyPath: \Filedetails.year, ascending: false), NSSortDescriptor(keyPath: \Filedetails.sequence, ascending: false)]
fetchquest1.predicate = NSPredicate(format: "%K == 1", filterkey1)
let item1 = try? context.fetch(fetchquest1).firstIndex
let item1a = item1.compactMap { Int($0) }
return item1a
我曾试图强制解包该值,但出错
“无法将类型”(Filedetails)-〉Array.Index?“(也称为”(Filedetails)-〉Optional“)的值赋给类型”Int“”
var item1a: Int = 0
if let item1 = try? context.fetch(fetchquest1).firstIndex {
item1a = item1
}
return item1a
我试过“如果让”和“守卫让”
guard let item1 = try? context.fetch(fetchquest1).firstIndex else {
return 0
}
return item1
它仍然显示错误:
无法将类型为“(Filedetails)-〉Array.Index?”(也称为“(Filedetails)-〉Optional”)的返回表达式转换为返回类型“Int”
如果我使用.first
作为 predicate ,我可以得到数据的细节,但是当我使用.firstIndex
时,我不能得到结果。
如何将索引设置为Int
?
太感谢你了。
1条答案
按热度按时间0qx6xfy61#
问题是您的代码生成了两个可选项,一个是
try?
,另一个是first(Index)
。基于 predicate * 的 * first元素的第一个索引总是零,所以返回索引没有多大意义,尤其是在错误的情况下返回0。
调用
compactMap
也是没有意义的,因为输入和输出都是一个数组,它只是跳过了nil
* values *。为了避免双重可选,您可以返回可选的
Filedetails
项或将错误移交给调用方
旁注:考虑一个比
1
和1a
后缀更好的命名,这两个后缀有点混乱