2015-06-20 56 views
19

我遇到了一些我无法弄清楚的代码问题。之后,我安装的Xcode 7测试版,我的SWIFT代码转换为斯威夫特2Swift 2(executeFetchRequest):错误处理

代码:

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

截图:

enter image description here

回答

54

随着斯威夫特2,可可中的方法产生错误被转换为引发错误的Swift函数。

代替可选的返回值和误差参数作为夫特的1.x的:

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

夫特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"文档中。

+2

而且,如果您尝试使用填充了自定义值的数组,您的获取线将如下所示......'ideas = try self.managedObjectContext!.executeFetchRequest(fetchRequest)as! [想法]' – justColbs

+0

如果我只有'list'的实例而不是它的数组,我该怎么做? – jo3birdtalk

+0

@ jo3birdtalk:executeFetchRequest()总是返回一个数组。如果只有一个实例,则可以访问它,例如通过'list [0]'或'list.first'。 –

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

嗨,如果我没有一个'YourEntity'数组而只是一个实例,我该怎么做?我尝试没有大括号,它不断提示我,不能转换AnyObject键入'User' – jo3birdtalk

+0

@ jo3birdtalk只要让myResult = results?.first。如果你知道你的获取请求应该只返回一个对象,这就是你如何获得它。 – Macondo2Seattle

4

你可以试试这个代码:

let result = (try! self.manageContext.executeFetchRequest(FetchRequest)) as! [NSManageObjectClass] 
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)") 
     } 


    } 
+0

一般来说,我会建议你添加一个简短的描述,除了你发布的任何代码。 (例如,如果会出现拼写错误,或者人们没有机会直接尝试,人们仍然可以很容易地理解)。 –

3

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