Update: Per una soluzione migliore, vedo Rob's answer.
Allo stesso modo come in How can I create instances of managed object subclasses in a NSManagedObject Swift extension?, questo può essere fatto con un metodo di supporto generico:
extension NSManagedObject {
func transferTo(context context: NSManagedObjectContext) -> Self {
return transferToHelper(context: context)
}
private func transferToHelper<T>(context context: NSManagedObjectContext) -> T {
return context.objectWithID(objectID) as! T
}
}
Nota che ho cambiato il tipo di ritorno a Self
. objectWithID()
fa non restituiscono un optional (in contrasto con objectRegisteredForID()
, quindi non c'è alcuna necessità di ritorno un optional qui
Aggiornamento:.Jean-Philippe Pellet's suggested per definire una funzione riutilizzabile globale invece del metodo di supporto per trasmettere il valore restituito al tipo appropriato
Vorrei suggerire di definire due versioni (sovraccariche), per fare in modo che questo funzioni con oggetti opzionali e non opzionali (senza uno 012 indesideratoavvolgimento automatico in un opzionale):
func objcast<T>(obj: AnyObject) -> T {
return obj as! T
}
func objcast<T>(obj: AnyObject?) -> T? {
return obj as! T?
}
extension NSManagedObject {
func transferTo(context context: NSManagedObjectContext) -> Self {
let result = context.objectWithID(objectID) // NSManagedObject
return objcast(result) // Self
}
func transferUsingRegisteredID(context context: NSManagedObjectContext) -> Self? {
let result = context.objectRegisteredForID(objectID) // NSManagedObject?
return objcast(result) // Self?
}
}
(Ho aggiornato il codice per Swift 2/Xcode 7. Il codice per precedenti versioni Swift può essere trovato nella storia di modifica)
fonte
2015-01-30 10:24:13
Interessante! Questo probabilmente giustificherebbe l'uso di una funzione globale come questa forse, invece di ricreare metodi di supporto quando si presenta la necessità? 'cast cast (oggetto: Qualsiasi, tipo: T.Type) -> T? { \t return obj as? T } 'Ho aggiornato la mia risposta per proporla. –
@ Jean-PhilippePellet: Buona idea, ma l'argomento di 'obj' dovrebbe essere" Any? ", Altrimenti sembra non funzionare correttamente durante il cast di opzioni, come" NSManagedObject? "Restituito da' objectRegisteredForID() '. –
Oh sì, hai ragione, certo. Sto ancora pensando troppo in Scala dove i non-optionals non sono automaticamente avvolti. –