2015-09-23 7 views
5

Ich habe zwei Methoden in meiner objective-c-Bibliothek, die nach der Konvertierung in Swift die gleiche Methodensignatur zu haben scheint. Sie sind wie in Objective-C folgt:Objective-C-Methodensignaturen sind nach Swift-Konvertierung identisch

- (void)doSomething:(UIViewController *)viewController __attribute__((deprecated)); 
- (BOOL)doSomething:(UIViewController *)viewController error:(NSError **)error; 

Von dem, was ich über Swift Umwandlung von Methoden gelesen haben NSErrors + BOOL Rückgabewerte in Objective-C verwenden, werden diese Methoden am Ende die folgenden Swift Methode Signaturen mit:

func doSomething(viewController: UIViewController) 
func doSomething(viewController: UIViewController) throws 

Da der erste Anruf tatsächlich in Objective-C ist veraltet, ist es eine Möglichkeit, Anrufe zu dieser Methode gemacht zu zwingen, die zweite Signatur zu verwenden (um sicherzustellen, dass ich die Vorteile der geworfenen Fehler dauern kann)?

Ich versuche, das Verfahren in der folgenden Weise zu nennen:

do { 
    try myObjectInstance.doSomething(self) 
} catch let error as NSError { 
    print(error) 
} 

Dieser Ansatz zur ersten Erklärung auf dem Standard scheint, die mir eine Warnung zu geben, dass a) die Methode veraltet ist und b) Es gibt nichts zu fangen, weil keine Fehler geworfen werden.

Antwort

0

können Sie die NS_SWIFT_UNAVAILABLE Makro verwenden, es ist nicht verfügbar Swift zu markieren:

- (void)doSomething:(UIViewController *)viewController 
    __attribute__((deprecated)) NS_SWIFT_UNAVAILABLE("use the throwing variant"); 

Dann wird der Swift-Compiler wird die einzige verfügbare Methode wählen, die andere ist.

(In meinen Tests scheint dies die automatische Vervollständigung zu brechen - Sie file a bug darüber mögen.)

+0

Oh, eine Bibliothek Update wäre bedauerlich, wenn das der einzige Weg ist, dass dies getan werden kann. Das heißt, bessere Lösung als gar keine! Vielen Dank!! – Maixy

+0

Vermutlich könnten Sie auch eine separate Obj-C-Methode (in einer Kategorie oder etwas) erstellen, die in dem Swift-Ziel enthalten ist, nur um mit dem Interop zu helfen, und ruft das entsprechende auf. – jtbandes

Verwandte Themen