obj.setValue(value, forKey: key)
を使用してSwiftコードに@objc
オブジェクトの値を設定しようとしています。
オブジェクトにプロパティが設定されている場合は正常に機能します。しかし、そうでない場合、私のアプリはキャッチされていないNSException
で激しくクラッシュします(「クラスはキー値コーディングに準拠していません…」)。
アプリがクラッシュしないように、Objective-Cのようにこの例外をキャッチして吸収するにはどうすればよいですか? Swift try-catchでラップしようとしましたが、どの命令もスローされず、何も実行されないというメッセージが表示されます。
これを参照してください 回答 :
//
// ExceptionCatcher.h
//
#import <Foundation/Foundation.h>
NS_INLINE NSException * _Nullable tryBlock(void(^_Nonnull tryBlock)(void)) {
@try {
tryBlock();
}
@catch (NSException *exception) {
return exception;
}
return nil;
}
残念ながら、私が望んでいた答えではありませんでした。
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関数を追加することです。これは本当にひどい、アップル。
私はこの質問で与えられた答えを呼びたかった:
Swift do/catchを自然な方法で呼び出しで使用できるので、Swiftは、実際にObjC例外をキャッチする必要があります。