我做了一个泛型方法,它从核心数据库返回最后一条记录,但是在return语句中:return _lastItem as! [T]表示Thread X: signal SIGABRT。我该怎么解决?

func lastRecord<T: NSManagedObject>(_ type : T.Type, sort: NSManagedObject? = nil) -> [T] {
    let _context = DataBaseController.persistentContainer.viewContext
    let _request = T.fetchRequest()
    _request.fetchLimit = 1

    do {
        let _result = try _context.fetch(_request)
        if !_result.isEmpty {
            let _lastItem = _result[0]
            return _lastItem as! [T]
        } else {
             return _result as! [T]
        }
    } catch {
        print("Error : \(error)")
        return []
    }
}

提前谢谢!!

最佳答案

如注释中所述,_result[0]是单个对象(T),强制转换为数组([T])将崩溃。
另一个问题是返回类型是一个数组,或者保留返回类型

do {
   let _result = try _context.fetch(_request) as! [T]
    if !_result.isEmpty {
        return [_result[0]]
    } else {
         return _result
    }
} catch { ...

或者将返回类型更改为可选(T?
func lastRecord<T: NSManagedObject>(_ type : T.Type, sort: NSManagedObject? = nil) -> T? { ...

那么代码就是
do {
   let _result = try _context.fetch(_request) as! [T]
   return _result.first
} catch { ...

旁注:在Swift中,局部变量的前导下划线字符是非常不寻常的。

关于swift - 核心数据库最后记录的通用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42300588/

10-11 17:39