2015-10-27 12 views
6

Apple hat Phantasie neue Fehlerbehandlung in Swift 2Explicit altmodischer Fehler in Swift Handhabung 2

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

Ich bin mit Projekt arbeiten, das AFNetoworking v2.x verwendet, wo AFHTTPRequestSerializer 2 Selektoren hat:

- (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; 

Zuerst ist veraltet, aber zweite wird automatisch von Swift 2 Compiler in die erste Signatur konvertiert. Old fashioned Verfahren jetzt nicht erlaubt:

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

gibt mir eine Kompilierung Fehler:

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

Aber brandneue Notation Wähler mit Fehlerverarbeitung veraltet Variante ohne reduziert.

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

Was ist Best Practice in Swift 2, um dieses Problem zu lösen? Gibt es eine Möglichkeit, bestimmte Selektoren in dieser Situation anzugeben?

UPD: Genauerer Link auf Swift 2-Funktion, die ein Grund für mein Problem geworden sind. https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-ID10

+1

Nun zu verwenden, ich weiß, was ich tun würde; Ich würde eine Trampolin-Methode in Objective-C schreiben. (Und ich würde einen Fehlerbericht mit den AFNetworking Leuten einreichen.) – matt

+0

Ja sieht es wie eine bessere Wahl aus, falls Swift 2 keine Werkzeuge hat, um das selbst zu lösen. Aber ich frage mich, ob Swift-Architekten solche Probleme vorhergesagt haben und sie hatten einen guten Weg, diese Art von Problemen zu überwinden. – lazarev

+0

Sind Sie sicher, dass die veraltete Variante aufgerufen wird? Vielleicht mischt Xcode gerade die Verwarnungswarnungen durcheinander? – Sulthan

Antwort

-1

Swift 2 bevorzugt, Try Catch-Block nur für die erforderlichen Methoden bereitzustellen. Wenn Ihre Methode also Fälle enthält, in denen Sie eine Fehlerbehandlung benötigen, dann stellen Sie diesen Block nur zur Verfügung.

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

Eigentlich musste ich genauere Angaben zu diesem Mechanismus machen. Ich lege es auf den Boden. Ich verstehe, wie man Fehler in Swift 2 behandelt. Aber Swift 2 ändert automatisch alten Stil Selektoren von Objective C. Und diese "Funktion" kann Selektoren erzeugen, die mit anderen Selektoren in Konflikt stehen, wie ich in meinem Beispiel zeige. Ich weiß nur nicht, was ich in diesem Fall tun soll. https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-ID10 – lazarev

0

scheint dies richtig in Xcode funktioniert 7.1 (Ich erinnere mich, in 7.0 dieses Problem haben) nur Ihre Methode ändern, um einen Fehlerzeiger d.h &error

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

Ich habe meine aktualisiert Xcode noch nicht. Ich werde es mit Xcode 7.1 versuchen. Hoffe das hilft. Vielen Dank! – lazarev

+0

Ich habe immer noch Fehler für diesen Code nach dem Update auf Xcode 7.1: "Argument übergeben, um keine Argumente zu nehmen" – lazarev

+0

@lazarev wickeln Sie es in einem 'do {} catch {}' Block? Nur noch einmal getestet ohne "Do Catch" und es scheint gut zu kompilieren. Werden Sie den Code, den Sie verwenden, und die Version von 'AFNetworking' posten – sbarow