【Swift】#ifや#availableとは?コンパイラ制御ステートメントの使い方!
この記事からわかること
- Swiftのコンパイラ制御ステートメント(Compiler Control Statements)とは?
- #ifや#availableの使い方
- コンパイルとは?
- #sourceLocation、#error、#warningなどの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献: 公式リファレンス-コンパイラ制御ステートメント(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 compilation condition
statements
#endif
通常のif文と同様にifの右側に条件を記述し、ブロックの中に実行させたいコードを記述します。条件には真偽値リテラルや以下のプラットフォーム条件を使用できます。
プラットフォーム条件
プラットフォーム | 引数 |
---|---|
os() | macOS、iOS、watchOS、tvOS、Linux、Windows |
arch() | i386,x86_64, arm,arm64 |
swift() | >=または<の後にバージョン番号 |
compiler() | >=または<の後にバージョン番号が続く |
canImport() | モジュール |
targetEnvironment() | simulator、macCatalyst |
使用例
#if os(iOS)
print("iOS")
#endif
#if os(macOS)
print("macOS")
#endif
#if swift(>=5.1)
print("Swift 5.1 以上")
#endif
#if targetEnvironment(simulator)
print("simulator")
#endif
また論理演算子(&&や||など)を使用した複数条件指定や#elseif
、#else
を使用した分岐処理も用意されてます。
開発/リリースモードで分岐する
Active Compilation Conditionsに設定されている値からデバッグモードとリリースモードを識別することも可能です。
#if DEBUG
Text("開発モード")
#else
Text("リリースモード")
#endif
おすすめ記事:【Xcode】開発環境(ReleaseとDebug)モードの切り替え方法
#sourceLocation:行制御ステートメント
行制御ステートメント(line-control-statement)はコンパイル中のファイルとソースコードとは別ファイルのファイル名とソースコードを指定できるステートメントです。これを使用することでエラー発生時に別ファイルを指し示すエラーメッセージを表示させるといったことが可能になります。
#sourceLocation
ディレクティブを使用して記述し、引数には変更したいファイルパスと行番号を渡します。
Swiftでは#fileID
や#line
などの環境に応じて値が変わるリテラルが用意されています。その値を明示的に変更できるのが#sourceLocation
です。
print(#fileID,#line) // プロジェクト名/test.swift 1
#sourceLocation(file: "changeFile", line: line 150)
print(#fileID,#line) // プロジェクト名/changeFile 150
#sourceLocation()
print(#fileID,#line) // プロジェクト名/test.swift 5
引数なしで呼び出すことでリセットできます。
#error:診断ステートメント(diagnostic-statement)
診断ステートメント(diagnostic-statement)はコンパイル時にエラーや警告を発生させるステートメントです。#error
や#warning
を使用して致命的エラーや警告を表示させコンパイルを終了させることができます。
#error("error message")
#warning("warning message")
#available:アベイラビリティ条件
availableは日本語で「利用可能」を意味する英単語であり、Swiftの#available
はif文などで指定されたプラットフォームかを検証する条件式として利用されます。コードではなくAttributeとして使用する@available
も用意されています。
if #available(iOS 16.0) {
print("iOS16以降")
}
使い方は引数にプラットフォーム名とバージョンを渡します。
#available(プラットフォーム名)
*
で全てのプラットフォームが対象になります。
プラットフォーム名
- *
- iOS
- iOSApplicationExtension
- macOS
- macOSApplicationExtension
- macCatalyst
- macCatalystApplicationExtension
- watchOS
- tvOS
availableの引数
さらに細かい条件指定を引数から指定することが可能です。
複数プラットフォーム
// iOS16以上 macOS4以上 その他全て
#available(iOS 16.0,macOS 4.0 ,*)
利用不可
// iOS 利用不可
#available(iOS 16.0,unavailable)
導入
// iOS 10で導入された
#available(iOS ,introduced=10.0)
非推奨
// iOS 14から非推奨
#available(iOS ,deprecated=14.0)
廃止
// iOS 14から廃止
#available(iOS ,obsoleted=14.0)
非推奨
// iOS 14から非推奨
#available(iOS ,deprecated=14.0,message="非推奨になりましたよ")
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。