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

【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)が用意されています。

  1. 条件付きコンパイルブロック(conditional-compilation-block)
  2. 行制御ステートメント(line-control-statement)
  3. 診断ステートメント(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")
【Swift】#ifや#availableとは?コンパイラ制御ステートメントの使い方!

#available:アベイラビリティ条件

availableは日本語で「利用可能」を意味する英単語であり、Swiftの#availableはif文などで指定されたプラットフォームかを検証する条件式として利用されます。コードではなくAttributeとして使用する@availableも用意されています。

if #available(iOS 16.0) {
    print("iOS16以降")
}

使い方は引数にプラットフォーム名とバージョンを渡します。

#available(プラットフォーム名)

*で全てのプラットフォームが対象になります。

プラットフォーム名

  1. *
  2. iOS
  3. iOSApplicationExtension
  4. macOS
  5. macOSApplicationExtension
  6. macCatalyst
  7. macCatalystApplicationExtension
  8. watchOS
  9. 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="非推奨になりましたよ") 

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index