Objective-Cの@availableの方法10選

Objective-Cの@availableの詳細解説Objctive-C
この記事は約15分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Objective-Cにおける@availableディレクティブは、iOSやmacOSなどのプラットフォームとそのバージョンに関連したAPIの利用可能性をチェックするためのものです。

iOSアプリ開発者にとっては、アプリの安定性を保ちながら、新しい機能を追加または既存の機能を更新する際に非常に有用なツールとなります。

@availableディレクティブの使用は、Objective-CだけでなくSwiftでも可能ですが、この記事ではObjective-Cに特化して詳しく説明します。

また、具体的な使い方やサンプルコード、注意点やカスタマイズ方法まで、幅広く徹底的に解説していきます。

@availableディレクティブをマスターすれば、iOSアプリの互換性を保ちつつ、新しいAPIや機能をスムーズに導入することができるようになります。

●@availableとは

availableは、指定したプラットフォームの特定のバージョンでAPIや機能が利用可能かどうかをチェックするための条件ディレクティブです。

これにより、特定のバージョン以下や以上でのみ動作するコードを簡単に記述することができます。

○Objective-Cのバージョンチェックの基本

Objective-Cでのバージョンチェックは、従来からさまざまな方法が利用されてきました。

例えば、特定のクラスやメソッドが存在するかどうかを確認する方法や、システムのバージョンを文字列として取得して比較する方法などがありました。

しかし、これらの方法はコードの可読性を低下させる原因となることが多く、

また、正確なバージョンのチェックが困難な場合もありました。@availableディレクティブを使用することで、これらの問題を解消し、簡潔で明確なバージョンチェックを行うことができます。

このディレクティブは、指定したプラットフォーム(iOS, macOS, watchOS, tvOSなど)の特定のバージョンにおけるAPIの利用可能性を簡単にチェックすることができます。

これにより、特定のバージョンのみで動作するコードや、特定のバージョン以上で使用可能な新しいAPIを安全に導入することができます。

●@availableの使い方

Objective-Cにおける@availableディレクティブは、iOSやmacOSの特定のバージョン、またはそれ以上で特定のAPIが利用可能かどうかをチェックするためのものです。

これにより、アプリが特定のOSバージョンやプラットフォームでのみ動作するコードや機能を簡単に実装することができます。

○サンプルコード1:基本的なバージョンチェック

このコードでは@availableを使ってiOSのバージョンチェックを行うコードを表しています。

この例では、iOS 12.0以上でのみ実行するコードを書いています。

if (@available(iOS 12.0, *)) {
    // iOS 12.0以上でのみ実行するコード
    NSLog(@"iOS 12.0以上での実行");
} else {
    // それ以外のバージョンで実行するコード
    NSLog(@"iOS 12.0未満での実行");
}

上記のコードを実行すると、実行しているデバイスのiOSバージョンが12.0以上であれば「iOS 12.0以上での実行」というメッセージが表示され、12.0未満であれば「iOS 12.0未満での実行」というメッセージが表示されます。

○サンプルコード2:特定のiOSバージョン以上でのみ実行

次に、特定のiOSバージョン以上でのみ実行されるコードを見てみましょう。

このコードでは、@availableを使ってiOS 14.0以上である場合のみ実行するコードを表しています。

if (@available(iOS 14.0, *)) {
    // iOS 14.0以上でのみ実行するコード
    NSLog(@"この機能はiOS 14.0以上で利用できます");
} else {
    NSLog(@"申し訳ございません、この機能はiOS 14.0以上でのみ利用可能です");
}

上記のコードを実行すると、デバイスのiOSバージョンが14.0以上であれば「この機能はiOS 14.0以上で利用できます」というメッセージが表示されます。

それ以外のバージョンで実行されると、「申し訳ございません、この機能はiOS 14.0以上でのみ利用可能です」というメッセージが表示されます。

○サンプルコード3:APIの利用可能性の確認

Objective-CにおけるiOSアプリ開発では、特定のAPIが利用可能かどうかをチェックする場面が数多くあります。

たとえば、新しいバージョンのiOSで導入されたAPIを使用したいが、古いバージョンでもアプリを動作させたい場合、そのAPIが利用可能かどうかを事前に確認する必要があります。

このコードでは、@availableを使って特定のAPIが利用可能かどうかを確認しています。

この例では、iOS 14で導入されたと仮定したAPIを利用する前に、そのAPIが利用可能かどうかを確認しています。

if (@available(iOS 14, *)) {
    // iOS 14で導入されたAPIを利用するコード
} else {
    // iOS 14未満の場合の代替処理
}

このコードのポイントは、@availableディレクティブをif文の条件として使用している点です。

これにより、指定したiOSバージョン以上であれば、その内部のコードが実行され、そうでなければelseのブロックが実行されるようになります。

この方法を使用することで、アプリの互換性を維持しながら新しいAPIを安全に利用することができます。

ここでの実行結果に関して、iOS 14以上のデバイスでこのコードを実行すれば、iOS 14で導入されたAPIのコードブロックが実行され、それ以前のバージョンでは代替処理の部分が実行されます。

○サンプルコード4:クラスの利用可能性の確認

同様に、特定のクラスが利用可能かどうかも@availableを使用して確認できます。

このコードでは、iOS 13で導入されたと仮定したクラスが利用可能かどうかを確認しています。

if (@available(iOS 13, *)) {
    // iOS 13で導入されたクラスを利用するコード
} else {
    // iOS 13未満の場合の代替処理
}

こちらのコードも、前述したAPIの利用可能性の確認と同様の構造を持っています。具体的なクラス名を示していませんが、この形式を使用することで、特定のクラスが利用できるバージョンかどうかを簡単に確認できます。

実行結果についても、iOS 13以上のデバイスであれば新しいクラスを使用したコードが、それ以前のバージョンでは代替処理が実行されます。

○サンプルコード5:メソッドの利用可能性の確認

メソッドの利用可能性の確認も、APIやクラスの利用可能性の確認と同じく@availableを使います。

このコードでは、iOS 12で導入されたと仮定したメソッドが利用可能かどうかを確認しています。

if (@available(iOS 12, *)) {
    // iOS 12で導入されたメソッドを利用するコード
} else {
    // iOS 12未満の場合の代替処理
}

このコードも、上記と同様に@availableをif文の条件として使用しています。

iOS 12以上の場合、新しいメソッドを利用したコードが実行され、それ以前のバージョンでは代替処理が実行されます。

実行結果に関しても、iOS 12以上のデバイスでこのコードを実行すれば、iOS 12で導入されたメソッドのコードブロックが実行され、それ以下のバージョンでは代替処理の部分が実行される形となります。

●@availableの応用例

Objective-Cの@availableディレクティブは、単にiOSのバージョンだけでなく、さまざまな条件を組み合わせて柔軟なチェックを実施することができます。

応用例として、複数の条件を組み合わせる方法や、iOSとmacOSの両方でのチェック方法について詳しく見ていきましょう。

○サンプルコード6:複数の条件を組み合わせる

このコードでは@availableを使って、複数の条件を組み合わせてAPIの利用可能性をチェックするコードを表しています。

この例ではiOS 15.0以上またはmacOS 12.0以上で利用可能なAPIを確認しています。

if (@available(iOS 15.0, macOS 12.0, *)) {
    // iOS 15.0以上またはmacOS 12.0以上で利用可能なAPIの処理
} else {
    // それ以外の場合の処理
}

このコードを実行すると、iOS 15.0以上またはmacOS 12.0以上の環境では上のブロックの処理が行われ、それ以外の環境ではelseのブロックの処理が行われます。

このように、@availableを使うことで、複数のプラットフォームやバージョンにまたがった条件を簡潔に記述することができます。

○サンプルコード7:iOSとmacOSの両方でのチェック

このコードでは@availableを使って、iOSとmacOSの両方でAPIの利用可能性をチェックするコードを表しています。

この例ではiOS 14.0以上、かつmacOS 11.0以上で利用可能なAPIを確認しています。

#if TARGET_OS_IOS
if (@available(iOS 14.0, *)) {
    // iOS 14.0以上で利用可能なAPIの処理
} else {
    // iOS 14.0未満の場合の処理
}
#elif TARGET_OS_MAC
if (@available(macOS 11.0, *)) {
    // macOS 11.0以上で利用可能なAPIの処理
} else {
    // macOS 11.0未満の場合の処理
}
#endif

このコードを実行すると、iOS 14.0以上の環境では最初のifブロック内の処理が行われ、iOS 14.0未満の環境では最初のelseブロックの処理が行われます。

同様に、macOS 11.0以上の環境では二番目のifブロック内の処理が行われ、macOS 11.0未満の環境では二番目のelseブロックの処理が行われます。

このように、TARGET_OS_IOSやTARGET_OS_MACなどのマクロを組み合わせることで、複数のプラットフォームをターゲットにした条件分岐を効率的に行うことができます。

●@availableの応用例

@availableディレクティブを活用することで、様々な条件を組み合わせてAPIの利用可能性をチェックすることができます。

実際には、iOSだけでなくmacOSなど他のプラットフォームでのバージョンチェックも行うことが可能です。

ここでは、いくつかの応用例をサンプルコードとともに詳細に説明します。

○サンプルコード8:非推奨APIの確認

非推奨とされているAPIを使用するときは注意が必要です。

しかし、@availableを使用することで、特定のバージョン以降で非推奨とされたAPIの使用をチェックすることができます。

if (@available(iOS 12.0, *)) {
    // iOS 12.0以降のコード
} else {
    // iOS 12.0未満のコード、もしくは非推奨のAPIを使用する部分
}

このコードでは、iOSのバージョンが12.0以上かどうかをチェックしています。

12.0以上の場合、新しいAPIを使用してコードを実行することができます。

12.0未満の場合、非推奨のAPIを使用してコードを実行します。

このような条件分岐を利用することで、アプリの互換性を保ちつつ、新しい機能を追加することができます。

○サンプルコード9:新しい機能の追加と古い機能の非表示

あるバージョン以降で新しく追加された機能を利用する場合や、古い機能を非表示にする場合も@availableを活用することができます。

if (@available(iOS 14.0, *)) {
    // iOS 14.0以降で追加された新しい機能を利用
} else {
    // iOS 14.0未満での処理、もしくは非表示にする機能
}

このコードでは、iOSのバージョンが14.0以上かどうかをチェックしています。

14.0以上の場合、新しい機能を利用してコードを実行することができます。

14.0未満の場合、古い機能を非表示にするなどの対応を行います。

これにより、バージョンによって異なるUIや機能の提供がスムーズに行えます。

○サンプルコード10:特定のバージョン範囲のチェック

特定のバージョン範囲でのみ実行する処理を行いたい場合、@availableを使って複数の条件を組み合わせることができます。

if (@available(iOS 13.0, *)) {
    if (!@available(iOS 15.0, *)) {
        // iOS 13.0以上、15.0未満の処理
    }
}

この例では、iOSのバージョンが13.0以上かつ15.0未満の場合のみ特定の処理を行います。

このように、@availableを組み合わせることで、特定のバージョン範囲に絞った条件分岐を実現することができます。

●注意点と対処法

Objective-Cで@availableを使用する際の注意点と対処法について詳しく解説します。

@availableディレクティブは非常に便利なツールですが、適切に使用しなければ意図しない動作やバグの原因となります。

○新しいAPIの取り扱い

このコードでは、新しいAPIを使用する場合の注意点とその取り扱いに関するコードを表しています。

新しいAPIを導入する際、古いバージョンのiOSでの動作保証はされていません。

そのため、@availableを使用してバージョンのチェックを行うことが重要です。

if (@available(iOS 15.0, *)) {
    // iOS 15.0以降で利用可能なAPIの使用
} else {
    // 古いバージョンのiOSでの代替処理
}

この例では、iOS 15.0以降でのみ利用可能なAPIを使用しています。

15.0未満の場合は、代替処理を行っています。

このコードの実行結果として、iOS 15.0以降であれば新しいAPIの機能が利用され、それ未満の場合は代替処理が実行されることになります。

○非推奨APIの取り扱い

このコードでは、非推奨のAPIを使用する場合の注意点とその取り扱いに関するコードを表しています。

非推奨のAPIは将来的に削除される可能性があるため、使用を控えるか、新しいAPIに置き換えることが推奨されます。

if (@available(iOS 14.0, *)) {
    // 新しいAPIの使用
} else {
    // iOS 14.0未満での非推奨APIの使用
}

この例では、iOS 14.0以降でのみ新しいAPIを使用し、それ未満の場合は非推奨のAPIを使用しています。

このコードの実行結果として、iOS 14.0以降であれば新しいAPIの機能が利用され、それ未満の場合は非推奨のAPIが使用されることになります。

○コードの保守性と可読性

@availableを多用することでコードの保守性や可読性が低下する可能性があります。

例えば、同じ条件分岐が複数の場所に散らばっていると、iOSの新バージョンがリリースされた際の対応が煩雑になります。

そのため、バージョンによる条件分岐を一元化する、または共通の関数やメソッドにまとめることが推奨されます。

また、@availableを使用することで、どのiOSバージョンでどの機能が利用可能かという情報がコード上に明示的に表れます。

これにより、他の開発者がコードを読む際にもその情報が直感的に理解しやすくなります。

●カスタマイズ方法

Objective-Cの@availableディレクティブは、iOSやmacOSのバージョンや特定のAPIが使用可能かどうかをチェックする際に非常に役立つ機能です。

しかし、その使用方法や条件をカスタマイズすることで、更に柔軟に、そして効果的にこのディレクティブを活用することができます。

ここでは、@availableのカスタマイズ方法について解説していきます。

○@availableのカスタマイズの基本

@availableディレクティブの基本的な使用方法は、特定のOSバージョンでのAPIの利用可能性をチェックするものです。

しかし、その条件をカスタマイズすることで、特定の状況や要件に合わせてチェックの条件を変更することができます。

例えば、ある特定のバージョンのみを対象とする、または特定のバージョンを除外するといった条件を追加することが可能です。

このコードでは、iOS 10.0以上、しかしiOS 12.0未満のバージョンである場合にのみコードを実行する例を表しています。

この例では、iOS 10.0以上で、かつiOS 12.0未満のバージョンを対象としています。

if (@available(iOS 10.0, *)) {
    if (!@available(iOS 12.0, *)) {
        // iOS 10.0以上、そしてiOS 12.0未満の時のみこのコードが実行される
    }
}

このように、@availableディレクティブを組み合わせることで、特定のバージョン範囲に絞った条件を作成することができます。

さらに、@availableディレクティブを使用して、特定のプラットフォーム(例:iOSやmacOS)だけを対象とすることもできます。

これは、iOSとmacOSの両方で動作するアプリケーションを開発する際に特に役立ちます。

このコードでは、iOSの場合のみ特定のバージョンをチェックして処理を行う例を表しています。

この例では、iOSの場合のみ、そしてそのiOSが10.0以上の場合に特定のコードを実行します。

#if TARGET_OS_IOS
if (@available(iOS 10.0, *)) {
    // iOS 10.0以上の場合のみこのコードが実行される
}
#endif

このように、@availableディレクティブとプリプロセッサディレクティブを組み合わせることで、特定のプラットフォームやバージョンに絞った処理を実装することができます。

まとめ

Objective-Cの@availableディレクティブは、アプリケーション開発においてOSのバージョンやAPIの利用可能性を効果的にチェックするための強力なツールです。

特に、iOSやmacOSなど複数のプラットフォームを対象とするアプリケーションの開発では、その価値は計り知れません。

@availableの基本的な使い方から応用的なカスタマイズ方法まで、多岐にわたる活用法が存在します。

これをマスターすることで、iOSアプリ開発はもちろん、macOSアプリ開発もさらに簡単に、そして品質の高いものとなるでしょう。

今回の内容をしっかりと理解し、日々の開発に活かしていきましょう。