web-dev-qa-db-ja.com

Swift)でObjective-C例外をキャッチ

obj.setValue(value, forKey: key)を使用してSwiftコードに@objcオブジェクトの値を設定しようとしています。

オブジェクトにプロパティが設定されている場合は正常に機能します。しかし、そうでない場合、私のアプリはキャッチされていないNSExceptionで激しくクラッシュします(「クラスはキー値コーディングに準拠していません…」)。

アプリがクラッシュしないように、Objective-Cのようにこの例外をキャッチして吸収するにはどうすればよいですか? Swift try-catchでラップしようとしましたが、どの命令もスローされず、何も実行されないというメッセージが表示されます。

12
devios1

これを参照してください 回答

//
//  ExceptionCatcher.h
//

#import <Foundation/Foundation.h>    

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

残念ながら、私が望んでいた答えではありませんでした。

Swiftエラー処理はObjective-Cの例外処理に似ていますが、完全に別個の機能です。Objective-Cメソッドが実行時に例外をスローすると、Swiftランタイムエラー。SwiftでObjective-C例外から直接回復する方法はありません。例外処理動作は、Swiftで使用されるObjective-Cコードで実装する必要があります。

抜粋:Apple Inc。「Swift with Cocoa and Objective-C(Swift2.1)」を使用しています。」iBooks。 https:// itun .es/ca /​​ 1u3-0.l

私の次の攻撃計画は、@try/@catchで試行をラップするObjective-C関数を追加することです。これは本当にひどい、アップル。

8
devios1

私はこの質問で与えられた答えを呼びたかった:

SwiftでNSExceptionをキャッチ

Swift do/catchを自然な方法で呼び出しで使用できるので、Swiftは、実際にObjC例外をキャッチする必要があります。