【问题标题】:Swift 2 ( executeFetchRequest ) : error handlingSwift 2 (executeFetchRequest):错误处理
【发布时间】:2015-09-06 09:58:10
【问题描述】:

我遇到了一些我无法弄清楚的代码问题。在我安装了 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()
}

屏幕截图:

【问题讨论】:

    标签: swift swift2


    【解决方案1】:

    从 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)")
    }
    

    有关详细信息,请参阅"Adopting Cocoa Design Patterns" 中的“错误处理” 在"Using Swift with Cocoa and Objective-C" 文档中。

    【讨论】:

    • 如果您尝试使用填充自定义值的数组,您的 fetch 行将如下所示...ideas = try self.managedObjectContext!.executeFetchRequest(fetchRequest) as! [Ideas]
    • 如果我只有一个 list 的实例而不是它的数组,我该怎么做?
    • @jo3birdtalk:executeFetchRequest() 总是返回一个数组。如果只有一个实例,那么您可以访问它,例如通过list[0]list.first
    【解决方案2】:

    你可以试试这个代码:

    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)")
      

      【讨论】:

        【解决方案4】:
        var results = [YourEntity]?
        results = try! self.managedObjectContext!.executeFetchRequest(fetchRequest) as! [YourEntity]
        

        【讨论】:

        • 嗨,如果我没有YourEntity 的数组,而只有它的一个实例,我该怎么做?我试过不带大括号,它一直提示我无法将 AnyObject 转换为类型“用户”
        • @jo3birdtalk 让 myResult = results?.first。如果您知道您的 fetch 请求应该只返回一个对象,那么您可以通过以下方式获取它。
        【解决方案5】:

        试试下面的代码

         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)")
                }
        
        
            }
        

        【讨论】:

        • 一般来说,我建议您在发布的任何代码之外添加简短描述。 (这样,例如,如果有错字,或者如果人们没有机会直接尝试,人们仍然可以很容易地理解这一点)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-02
        • 1970-01-01
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        相关资源
        最近更新 更多