Swift 2(executeFetchRequest):错误处理

20
我有一些与代码相关的问题,但我无法解决。在我安装了Xcode 7 beta并将我的Swift代码转换为Swift 2之后。

代码:

override func viewDidAppear(animated: Bool) {

    let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    let context: NSManagedObjectContext = AppDel.managedObjectContext
    let request = NSFetchRequest(entityName: "PlayerList")

    list = Context.executeFetchRequest(request)

    tableView.reloadData()
}

屏幕截图:

在此输入图片描述

5个回答

54

从Swift 2开始,产生错误的Cocoa方法被转换为抛出错误的Swift函数。

不再像Swift 1.x中那样返回可选值和错误参数:

var error : NSError?
if let result = context.executeFetchRequest(request, error: &error) {
    // success ...
    list = result
} else {
    // failure
    println("Fetch failed: \(error!.localizedDescription)")
}

Swift 2 中,该方法现在返回一个非可选值并抛出错误,如果出现错误,则必须使用try-catch进行处理:

do {
    list = try context.executeFetchRequest(request)
    // success ...
} catch let error as NSError {
    // failure
    print("Fetch failed: \(error.localizedDescription)")
}

有关更多信息,请参见“采用Cocoa设计模式”文档中的“错误处理”部分,在“使用Swift与Cocoa和Objective-C”文档中。


2
如果您想使用填充有自定义值的数组,那么您的获取代码将如下所示... ideas = try self.managedObjectContext!.executeFetchRequest(fetchRequest) as! [Ideas] - justColbs
如果我只有一个 list 的实例而不是数组,我该怎么办? - jo3birdtalk
@jo3birdtalk:executeFetchRequest() 总是返回一个数组。如果只有一个实例,那么你可以通过 list[0]list.first 访问它。 - Martin R

4
您可以尝试这段代码:
let  result = (try! self.manageContext.executeFetchRequest(FetchRequest)) as! [NSManageObjectClass]

3

Swift 3.0 在这个例子中,PlayerListNSManagedObject 实体/类名(由 Xcode 自动创建)。

let request: NSFetchRequest<PlayerList> = PlayerList.fetchRequest()

var result:[PlayerList]?
do{
      //Succes 
      result = try context.fetch(request)
   }catch let error as NSError {
      //Error 
      print("Error \(error)")
  }

print("result: \(result)")

1
var results = [YourEntity]?
results = try! self.managedObjectContext!.executeFetchRequest(fetchRequest) as! [YourEntity]

你好,如果我没有一个 YourEntity 的数组,只有它的一个实例,我该怎么做呢?我尝试过不使用大括号,但它一直提示我无法将 AnyObject 转换为类型 'User'。 - jo3birdtalk
@jo3birdtalk 只需执行 let myResult = results?.first。如果您知道您的获取请求只会返回一个对象,那么这就是您可以获取它的方式。 - TotoroTotoro

1
尝试下面的代码:
 override func viewWillAppear(animated: Bool) {

        let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
        let context = appDel.managedObjectContext
        let request = NSFetchRequest(entityName:"Users")
        do {
            let results = try context.executeFetchRequest(request)

            itemList = results as! [NSManagedObject]


        } catch let error as NSError {
            print("Could not fetch \(error), \(error.userInfo)")
        }


    }

一般来说,我建议您在发布任何代码时都添加一个简短的描述。(例如,如果有拼写错误或者人们无法直接尝试它,人们仍然可以轻松理解重点)。 - Dennis Jaheruddin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接