2014-09-01 8 views
15

Viene visualizzato il seguente errore: 'Bool' non è un sottotipo di 'Void'Swift - 'Bool' non è un sottotipo di 'Void'?

performBlock richiede una chiusura nulla senza argomento e il metodo stesso ha un singolo argomento, quindi dovrei essere in grado di utilizzare il seguendo la sintassi per la mia chiusura. Perché sto ricevendo questo errore di compilazione?

workingManagedObjectContext.performBlock { 
    self.workingManagedObjectContext.save(nil) 

    self.managedObjectContext.performBlock { 
     self.managedObjectContext.save(nil) 
    } 
} 

risposta

27

L'argomento performBlock è una chiusura tenendo senza argomenti e ritorno Void (cioè senza valore di ritorno). Se la chiusura consiste in una singola espressione , il tipo di ritorno viene dedotto da il tipo di tale espressione. Il tipo di

self.managedObjectContext.save(nil) 

è Bool, che non può essere implicitamente convertito Void. Per risolvere questo problema, è possibile aggiungere un return esplicito:

self.managedObjectContext.performBlock { 
    self.managedObjectContext.save(nil) 
    return 
} 

o (meglio), controllare il valore restituito dell'operazione save invece di ignorarlo:

self.managedObjectContext.performBlock { 
    var error : NSError? 
    if !self.managedObjectContext.save(&error) { 
     // report error 
    } 
} 

(e fare il lo stesso per il salvataggio del livello esterno).


Aggiornamento: Come di Swift 1.2 (Xcode 6.3), non annotate chiusure singola espressione con i tipi di ritorno non Void possono ora essere utilizzati in contesti Void. Quindi, questo non ora compilare senza errori:

self.managedObjectContext.performBlock { 
    self.managedObjectContext.save(nil) 
    // explicit "return" not needed anymore in Swift 1.2 
} 

(Naturalmente è ancora meglio in realtà controllo il valore restituito dal l'operazione di salvataggio.)

Problemi correlati