核心数据库最后记录的通用方法

时间:2017-02-17 14:39:05

标签: swift core-data

我制作了一个通用方法,该方法从核心数据库返回最后一条记录,但在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 []
    }
}

提前致谢!!

1 个答案:

答案 0 :(得分:1)

正如评论_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中非常不寻常。