ユニバーサルiPhoneアプリを作成しようとしていますが、新しいバージョンのSDKでのみ定義されているクラスを使用しています。フレームワークは古いシステムに存在しますが、フレームワークで定義されたクラスは存在しません。
私は何らかの弱いリンクを使用したいと思っていますが、関数の存在のランタイムチェックに関する話を見つけることができるドキュメント-クラスが存在することを確認するにはどうすればよいですか?
現在:
if #available(iOS 9, *)
if (@available(iOS 11.0, *))
if (NSClassFromString(@"UIAlertController"))
レガシー:
if objc_getClass("UIAlertController")
if (NSClassFromString(@"UIAlertController"))
if ([UIAlertController class])
歴史的には特定のOSバージョンではなく機能(またはクラスの存在)を確認することが推奨されていましたが、これはSwift 2.0の導入により でうまく機能しません可用性チェック 。
代わりにこの方法を使用します。
_if #available(iOS 9, *) {
// You can use UIStackView here with no errors
let stackView = UIStackView(...)
} else {
// Attempting to use UIStackView here will cause a compiler error
let tableView = UITableView(...)
}
_
注:代わりにobjc_getClass()
を使用しようとすると、次のエラーが表示されます。
⛔️ 'UIAlertController'はiOS 8.0以降でのみ使用可能です。
_if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(...)
} else {
let alert = UIAlertView(...)
}
_
objc_getClass()
は、NSClassFromString()
またはobjc_lookUpClass()
よりも信頼性が高いことに注意してください。
_if ([SomeClass class]) {
// class exists
SomeClass *instance = [[SomeClass alloc] init];
} else {
// class doesn't exist
}
_
詳細については、 code007の回答を参照してください 。
_Class klass = NSClassFromString(@"SomeClass");
if (klass) {
// class exists
id instance = [[klass alloc] init];
} else {
// class doesn't exist
}
_
NSClassFromString()
を使用します。 nil
を返す場合、クラスは存在しません。それ以外の場合は、使用可能なクラスオブジェクトを返します。
これは、Apple in this document :
[...]コードは
NSClassFromString()
を使用して[a]クラスの存在をテストし、[the]クラスが存在する場合は有効なクラスオブジェクトを返し、存在しない場合はnilを返します。クラスが存在する場合、コードで使用できます[...]
IOS 4.2以降のベースSDKを使用する新しいプロジェクトには、NSObjectクラスメソッドを使用して実行時に弱くリンクされたクラスの可用性をチェックする、この新しい推奨アプローチがあります。つまり.
if ([UIPrintInteractionController class]) {
// Create an instance of the class and use it.
} else {
// Alternate code path to follow when the
// class is not available.
}
このメカニズムは、NS_CLASS_AVAILABLEマクロを使用します。このマクロは、iOSのmostフレームワークで使用できます(NS_CLASS_AVAILABLEをまだサポートしていないフレームワークがある可能性があります。これについては、iOSリリースノートを確認してください)。上記のAppleのドキュメントリンクで読むことができる追加の設定構成も必要になる場合がありますが、この方法の利点は静的な型チェックが得られることです。