2015-06-20 5 views
19

Ich habe ein Problem mit dem Code, den ich nicht herausfinden kann. Nachdem ich installiert Xcode 7 Beta und konvertieren meine schnellen Code Swift 2Swift 2 (executeFetchRequest): Fehlerbehandlung

Code:

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

ScreenShot:

enter image description here

Antwort

54

Ab Swift 2, Cocoa Methoden, die Fehler erzeugen werden in Swift-Funktionen übersetzt, die einen Fehler auslösen.

Anstelle eines optionalen Rückgabewert und einem Fehlerparameter wie in Swift 1.x:

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

in Swift 2 Verfahren gibt nun eine nicht optional und führt einen Fehler in die Fehlerfall, der mit try-catch behandelt werden müssen:

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

weitere Informationen finden Sie unter "Fehlerbehandlung" in "Adopting Cocoa Design Patterns" in der "Using Swift with Cocoa and Objective-C" Dokumentation.

+2

Und wenn Sie versuchen, ein Array mit benutzerdefinierten Werten gefüllt zu verwenden, Ihre holen Linie wird wie folgt aussehen ... 'Ideen = versuchen self.managedObjectContext! .executeFetchRequest (fetchRequest) wie! [Ideen] ' – justColbs

+0

Wenn ich nur eine Instanz von' list' und kein Array dafür habe, wie mache ich das? – jo3birdtalk

+0

@ jo3birdtalk: executeFetchRequest() gibt immer ein Array zurück. Wenn es nur eine Instanz gibt, können Sie darauf z. über 'list [0]' oder 'list.first'. –

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

Hallo, Wenn ich kein Array von 'YourEntity' habe, sondern nur eine Instanz davon, wie mache ich das? Ich habe versucht, ohne die geschweiften Klammern, es fragt mich immer wieder, dass AnyObject nicht konvertiert werden kann, um 'User' – jo3birdtalk

+0

@ jo3birdtalk zu geben. Lassen Sie einfach myResult = results? .first. Wenn Sie wissen, dass Ihre Abrufanforderung nur ein Objekt zurückgeben soll, können Sie es so erhalten. – Macondo2Seattle

4

Sie könnten diesen Code versuchen:

let result = (try! self.manageContext.executeFetchRequest(FetchRequest)) as! [NSManageObjectClass] 
1

Versuchen Sie den Code unten

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

Im Allgemeinen würde ich Ihnen empfehlen, zusätzlich zu jedem von Ihnen geposteten Code eine kurze Beschreibung hinzuzufügen. (Zum Beispiel, wenn es einen Tippfehler geben würde, oder wenn die Leute nicht in der Lage sind, es direkt zu versuchen, können die Leute den Punkt leicht verstehen). –

3

Swift 3.0 In diesem Beispiel Spieler ist NSManagedObject Einheit/Klassenname (Automatisch erstellt von 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)")