2015-10-27 15 views
6

Apple ha introdotto fantasia nuova gestione degli errori a Swift 2esplicita vecchia gestione a Swift errore antiquato 2

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html#//apple_ref/doc/uid/TP40014216-CH7-ID10

Sto lavorando con progetto che utilizza AFNetoworking v2.x dove AFHTTPRequestSerializer dispone di 2 selettori:

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
          URLString:(NSString *)URLString 
          parameters:(id)parameters DEPRECATED_ATTRIBUTE; 

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
          URLString:(NSString *)URLString 
          parameters:(id)parameters 
           error:(NSError * __autoreleasing *)error; 

Il primo è deprecato ma il secondo viene convertito automaticamente in prima firma dal compilatore Swift 2. Vecchio metodo ora non consentito:

var error: NSError? 
let request = self!.operationManager.requestSerializer.requestWithMethod(method, URLString: url?.absoluteString, parameters: params, error: error) 

mi dà un errore di compilazione:

Cannot convert value of type 'NSError?' to expected argument type '()' 

Ma nuova notazione riduce selettore con l'elaborazione di errore per variante deprecato senza di essa.

do { 
    let request = try 
    self!.operationManager.requestSerializer.requestWithMethod(method, URLString: url?.absoluteString, parameters: params) 
} catch let error as NSError { 
    // ... 
} 

Qual è la migliore pratica in Swift 2 per risolvere questo problema? C'è un modo per specificare un determinato selettore in questa situazione?

UPD: collegamento più preciso sulla funzione Swift 2 che diventa una ragione del mio problema. https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-ID10

+1

Beh, so cosa avrei fatto; Scriverò un metodo di trampolino in Objective-C. (E presenterei un bug report con gli utenti di AFNetworking.) – matt

+0

Sì, sembra una scelta migliore nel caso in cui Swift 2 non abbia strumenti per risolvere questo problema. Ma mi chiedo se gli architetti di Swift abbiano previsto tali problemi e avessero in mente un modo corretto di superare questo tipo di problemi. – lazarev

+0

Sei sicuro che la variante deprecata sia stata chiamata? Forse Xcode mescola solo gli avvisi di deprecazione? – Sulthan

risposta

-1

Swift 2 preferisce fornire il blocco Try Catch ai soli metodi necessari. Pertanto, se il tuo metodo ha casi in cui potresti aver bisogno di una gestione degli errori, fornisci solo questo blocco.

do {  
    try managedObjectContext.save() 
} catch { 

    // Replace this implementation with code to handle the error appropriately. 

    // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

    let NSError = error as NSError 

    NSLog("Unresolved error \(nserror), \(nserror.userInfo)") 
    abort() 
} 
+0

In realtà dovevo fornire un collegamento più preciso su questo meccanismo. L'ho messo sul fondo. Capisco come gestire gli errori in Swift 2. Ma Swift 2 cambia automaticamente i selettori di vecchio stile dall'obiettivo C. E questa "caratteristica" può produrre selettori che entrano in conflitto con altri selettori come mostro nel mio esempio. Non so proprio cosa fare in questo caso. https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-ID10 – lazarev

0

Sembra questo funziona correttamente in Xcode 7.1 (ricordo avendo questo problema in 7.0) basta cambiare il metodo di utilizzare un puntatore errore cioè &error

var error: NSError? 
let request = self!.operationManager.requestSerializer.requestWithMethod(method, URLString: url?.absoluteString, parameters: params, error: &error) 
+0

Non ho aggiornato il mio Xcode ancora. Lo proverò con Xcode 7.1. Spero che questo ti aiuti. Grazie! – lazarev

+0

Ho ancora errori per questo codice dopo l'aggiornamento a Xcode 7.1: "Argomento passato per chiamare che non richiede argomenti" – lazarev

+0

@lazarev lo stai avvolgendo in un blocco 'do {} catch {}'? Appena testato di nuovo senza 'fare catch' e sembra compilare bene. Pubblicherete il codice che state usando e la versione di 'AFNetworking' – sbarow