2015-06-20 2 views
19

Ho qualche problema con il codice che non riesco a capire. Dopo aver installato Xcode 7 beta e convertire il mio codice swift per Swift 2Swift 2 (executeFetchRequest): gestione degli errori

Codice:

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

schermata:

enter image description here

risposta

54

Come di Swift 2, metodi di cacao che produrre errori vengono tradotti in funzioni Swift che generano un errore.

Invece di un valore di ritorno opzionale e un parametro di errore come in 1.x Swift:

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

in Swift 2 il metodo ora restituisce un non-optional e genera un errore nel caso di errore, che deve essere maneggiata con try-catch:

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

Per ulteriori informazioni, consultare la sezione "Gestione degli errori" in "Adopting Cocoa Design Patterns" nella documentazione "Using Swift with Cocoa and Objective-C".

+2

E se si sta tentando di utilizzare una matrice riempita con valori personalizzati, il tuo prendere la linea sarà simile a questa ... 'idee = provare self.managedObjectContext! .executeFetchRequest (fetchRequest) come! [Idee] ' – justColbs

+0

Se ho solo un'istanza di' list' e non un array per questo, come faccio? – jo3birdtalk

+0

@ jo3birdtalk: executeFetchRequest() restituisce sempre un array. Se esiste solo un'istanza, puoi accedervi, ad es. tramite 'lista [0]' o 'list.first'. –

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

Salve, se non ho un array di 'YourEntity' ma solo un'istanza di esso, come faccio? Ho provato senza le parentesi graffe, continua a chiedermi che non è possibile convertire AnyObject per digitare 'Utente' – jo3birdtalk

+0

@ jo3birdtalk Basta fare myResult = risultati? .prima. Se sai che la tua richiesta di recupero dovrebbe restituire un solo oggetto, questo è il modo in cui puoi ottenerlo. – Macondo2Seattle

4

Si potrebbe provare questo codice:

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

provare il codice qui sotto

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

In generale, ti consiglio di aggiungere una breve descrizione oltre a qualsiasi codice che pubblichi. (Così, per esempio, se ci fosse un errore di battitura o se le persone non fossero nell'opportunità di provarlo direttamente, le persone possono ancora ottenere facilmente il punto). –

3

Swift 3.0 In questo esempio PlayerList è NSManagedObject entità/nome della classe (creato automaticamente da 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)")