2016-01-31 12 views
6

Próbuję ustawić wartość obiektu @objc w moim kodzie Swift za pomocą obj.setValue(value, forKey: key).Catch Objective-C wyjątek w Swift

Działa poprawnie, gdy obiekt ma ustawioną właściwość. Ale jeśli tak się nie stanie, moja aplikacja rozbija się mocno o nieprzechwycony NSException ("klasa nie jest zgodna z kodowaniem klucza wartości ...").

Jak mogę uchwycić i zaabsorbować ten wyjątek, tak jak mogę w Objective-C, aby nie uszkodzić mojej aplikacji? Próbowałem owijać go w próbkę Swift, ale narzeka, że ​​żadna z instrukcji nie rzuca i nie robi nic.

+0

Czy naprawdę potrzebujesz KVC? Obiekty w słownikach powinny być ustawione za pomocą 'setObject: forKey:' lub kluczowego indeksowania, szczególnie w Swift. – vadian

+0

Tak, piszę parser XML i muszę mieć możliwość ustawiania dowolnych właściwości obiektów według ich nazw. – devios1

+0

Zamiast przechwytywać wyjątek, sprawdź, czy klucz istnieje. – vadian

Odpowiedz

6

zobaczyć 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

To załatwiło sprawę! Nie ładne, ale cieszę się, że to przynajmniej możliwe! – devios1

+1

Ten jest znacznie ładniejszy: http://stackoverflow.com/a/36454808/364446 – KPM

3

nie odpowiedź miałem nadzieję, niestety:

Chociaż Swift obsługa błędów przypomina obsługę wyjątków w Objective-C, jest to całkowicie oddzielne funkcje. Jeśli metoda Objective-C zgłasza wyjątek podczas wykonywania, Swift uruchamia błąd środowiska wykonawczego. Nie ma sposobu na odzyskanie wyjątków od Objective-C bezpośrednio w Swift. Wszelkie zachowanie wyjątków musi być zaimplementowane w kodzie Objective-C używanym przez Swift.

Fragment: Apple Inc. "Używanie Swift z kakao i Objective-C (Swift 2.1)." IBooks. https://itun.es/ca/1u3-0.l

Mój następny plan ataku jest dodanie funkcji Objective-C mogę zawołać, że będą zawijać próbę w @try/@catch. To naprawdę jest do bani, Apple.

0

Chciałem zawołać odpowiedź udzieloną w tym pytaniu:

Catching NSException in Swift

jak można nadal używać Swift zrobić/połowu z połączenia w naturalna moda, kolejna najlepsza rzecz dla Swifta, która tak naprawdę powinna wychwytywać wyjątki ObjC.

Powiązane problemy