swift 我试图从Core Data获取元素的索引,但即使我强制解包索引值,它也显示错误

li9yvcax  于 2023-02-07  发布在  Swift
关注(0)|答案(1)|浏览(114)

我尝试使用一个函数对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
太感谢你了。

0qx6xfy6

0qx6xfy61#

问题是您的代码生成了两个可选项,一个是try?,另一个是first(Index)
基于 predicate * 的 * first元素的第一个索引总是零,所以返回索引没有多大意义,尤其是在错误的情况下返回0。
调用compactMap也是没有意义的,因为输入和输出都是一个数组,它只是跳过了nil * values *。
为了避免双重可选,您可以返回可选的Filedetails

func countingLastOccurrence(filterKey: String) -> Filedetails? {
    
    let context = PersistenceController.shared.container.viewContext
    let request = NSFetchRequest<Filedetails>(entityName: "Filedetails")
    request.sortDescriptors = [NSSortDescriptor(keyPath: \Filedetails.year, ascending: false), NSSortDescriptor(keyPath: \Filedetails.sequence, ascending: false)]
    request.predicate = NSPredicate(format: "%K == 1", filterKey)
    guard let result = try? context.fetch(request) else { return nil}
    return result.first
}

或将错误移交给调用方

func countingLastOccurrence(filterKey: String) throws -> Filedetails? {
    
    let context = PersistenceController.shared.container.viewContext
    let request = NSFetchRequest<Filedetails>(entityName: "Filedetails")
    request.sortDescriptors = [NSSortDescriptor(keyPath: \Filedetails.year, ascending: false), NSSortDescriptor(keyPath: \Filedetails.sequence, ascending: false)]
    request.predicate = NSPredicate(format: "%K == 1", filterKey)
    return try context.fetch(request).first
}

旁注:考虑一个比11a后缀更好的命名,这两个后缀有点混乱

相关问题