【Swift】#ifや#availableとは?コンパイラ制御ステートメントの使い方!

この記事からわかること
- Swiftのコンパイラ制御ステートメント(Compiler Control Statements)とは?
- #ifや#availableの使い方
- コンパイルとは?
- #sourceLocation、#error、#warningなどの使い方
index
[open]
\ アプリをリリースしました /
参考文献: 公式リファレンス-コンパイラ制御ステートメント(Compiler Control Statements)
コンパイラ制御ステートメント(Compiler Control Statements)とは?
Swiftはコンパイラ型の言語なのでソースコードをまとめて読み込み、コンパイル(変換)して処理していきます。
Swiftには「コンパイラ制御ステートメント(Compiler Control Statements)」なるものが用意されており、コードをコンパイルする際に様々な条件による分岐処理を行わせることが可能になっています。これによりOS自体の違いやバージョンの違いなどで異なるAPIの利用や定義を実装することができます。
大きく分けて3つのコンパイラ制御ステートメント(Compiler Control Statements)が用意されています。
- 条件付きコンパイルブロック(conditional-compilation-block)
- 行制御ステートメント(line-control-statement)
- 診断ステートメント(diagnostic-statement)
#if:条件付きコンパイルブロック
条件付きコンパイルブロック(conditional-compilation-block)はコンパイル時に条件に応じて分岐させることができます。#if
コンパイルディレクティブと#endif
コンパイルディレクティブを使用して条件分岐させます。
通常のif文と同様にifの右側に条件を記述し、ブロックの中に実行させたいコードを記述します。条件には真偽値リテラルや以下のプラットフォーム条件を使用できます。
プラットフォーム条件
プラットフォーム | 引数 |
---|---|
os() | macOS、iOS、watchOS、tvOS、Linux、Windows |
arch() | i386,x86_64, arm,arm64 |
swift() | >=または<の後にバージョン番号 |
compiler() | >=または<の後にバージョン番号が続く |
canImport() | モジュール |
targetEnvironment() | simulator、macCatalyst |
使用例
また論理演算子(&&や||など)を使用した複数条件指定や#elseif
、#else
を使用した分岐処理も用意されてます。
開発/リリースモードで分岐する
Active Compilation Conditionsに設定されている値からデバッグモードとリリースモードを識別することも可能です。
おすすめ記事:【Xcode】開発環境(ReleaseとDebug)モードの切り替え方法
#sourceLocation:行制御ステートメント
行制御ステートメント(line-control-statement)はコンパイル中のファイルとソースコードとは別ファイルのファイル名とソースコードを指定できるステートメントです。これを使用することでエラー発生時に別ファイルを指し示すエラーメッセージを表示させるといったことが可能になります。
#sourceLocation
ディレクティブを使用して記述し、引数には変更したいファイルパスと行番号を渡します。
Swiftでは#fileID
や#line
などの環境に応じて値が変わるリテラルが用意されています。その値を明示的に変更できるのが#sourceLocation
です。
引数なしで呼び出すことでリセットできます。
#error:診断ステートメント(diagnostic-statement)
診断ステートメント(diagnostic-statement)はコンパイル時にエラーや警告を発生させるステートメントです。#error
や#warning
を使用して致命的エラーや警告を表示させコンパイルを終了させることができます。

#available:アベイラビリティ条件
availableは日本語で「利用可能」を意味する英単語であり、Swiftの#available
はif文などで指定されたプラットフォームかを検証する条件式として利用されます。コードではなくAttributeとして使用する@available
も用意されています。
使い方は引数にプラットフォーム名とバージョンを渡します。
*
で全てのプラットフォームが対象になります。
プラットフォーム名
- *
- iOS
- iOSApplicationExtension
- macOS
- macOSApplicationExtension
- macCatalyst
- macCatalystApplicationExtension
- watchOS
- tvOS
availableの引数
さらに細かい条件指定を引数から指定することが可能です。
複数プラットフォーム
利用不可
導入
非推奨
廃止
非推奨
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。