2016-01-31 14 views
6

Ich versuche, den Wert eines @objc Objekts in meinem Swift-Code mit obj.setValue(value, forKey: key).Catch Objective-C Ausnahme in Swift

Es funktioniert gut, wenn das Objekt die Eigenschaft festgelegt hat. Aber wenn nicht, stürzt meine App mit einem nicht abgefangenen NSException ("Klasse ist kein Schlüsselwert, der mit der Codierung kompatibel ist ...") ab.

Wie kann ich diese Ausnahme wie in Objective-C abfangen und absorbieren, um meine App nicht zum Absturz zu bringen? Ich habe versucht, es in einen schnellen Try-Catch zu verpacken, aber es beschwert sich, dass keine der Anweisungen wirft und nichts tut.

+0

Brauchen Sie wirklich KVC? Objekte in Wörterbüchern sollen mit 'setObject: forKey:' oder Key-Subskripten speziell in Swift gesetzt werden. – vadian

+0

Ja, ich schreibe einen XML-Parser und muss in der Lage sein, beliebige Eigenschaften von Objekten anhand ihrer Namen festzulegen. – devios1

+0

Dann, anstatt eine Ausnahme abzufangen, prüfen Sie, ob der Schlüssel existiert. – vadian

Antwort

6

sehen diese answer:

// 
// ExceptionCatcher.h 
// 

#import <Foundation/Foundation.h>  

NS_INLINE NSException * _Nullable tryBlock(void(^_Nonnull tryBlock)(void)) { 
    @try { 
     tryBlock(); 
    } 
    @catch (NSException *exception) { 
     return exception; 
    } 
    return nil; 
} 
+0

Das hat den Trick gemacht! Nicht schön, aber ich bin froh, dass es zumindest möglich ist! – devios1

+1

Dieser ist viel hübscher: http://stackoverflow.com/a/36454808/364446 – KPM

3

nicht die Antwort war ich gehofft, leider:

Obwohl Swift Fehlerbehandlung Ausnahmebehandlung in Objective-C ähnelt, ist es völlig getrennte Funktionalität. Wenn eine Objective-C-Methode während der Laufzeit eine Ausnahme auslöst, löst Swift einen Laufzeitfehler aus. Es gibt keine Möglichkeit, direkt in Swift von Objective-C-Ausnahmen zu erholen. Jedes Ausnahmebehandlungsverhalten muss in Objective-C-Code implementiert werden, der von Swift verwendet wird.

Auszug aus: Apple Inc. "mit Swift mit Kakao und Objective-C (Swift 2.1)." IBooks. https://itun.es/ca/1u3-0.l

Mein nächster Plan des Angriffs ist eine Objective-C-Funktion hinzuzufügen ich, dass ausrufen kann, wird der Versuch in @try/@catch wickeln. Das ist wirklich scheiße, Apple.

0

Ich wollte in dieser Frage gegeben, um die Antwort rufen:

Catching NSException in Swift

wie Sie können immer noch die Swift tun/catch mit dem Aufruf verwenden in eine natürliche Mode, die nächste beste Sache, um Swift tatsächlich ObjC Ausnahmen zu fangen, wie es sollte.

Verwandte Themen