2017-02-17 90 views
0

我做了一個通用方法,它返回核心數據庫中的最後一條記錄,但是在返回語句中: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

當然'return [_lastItem] as! [T]'? – Grimxn

+2

'_result'是一個數組。 'let _lastItem = _result [0]'是一個管理對象。你可能想返回'T'而不是'[T]' –

+0

@MartinR謝謝你的回答! – yerpy

回答

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中局部變量的相當不尋常。

+0

每當我的數據庫是空的時候,應用程序將會再次崩潰,其他語句也會崩潰。 – yerpy

+0

我的不好,我更新了答案。 – vadian

+0

從這裏拋出的錯誤不是處理程序,我應該在catch塊中返回什麼? – yerpy