[Swift] macro を使ってみる

     
⌛️ 2 min.

Macro を使う手順をおさらいします。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS14.3
  • Xcode 15.2
  • iOS 17.2
  • Swift 5.9

Macro

Swift5.9 で導入された macro は非常に便利です。


参考
MacroApple Developer Documentation

ですが、ドキュメントには、@… や #… と書く 等の実際に使用するケースでの説明が多く、どうやってプロジェクトで使用できるかの説明が抜けている気がします・・・

ということで、改めて、プロジェクトに macro を導入する手順を確認してみます。

Swift Package

がんばると(?)、Swift Package 経由ではない利用方法も存在するみたいですが、Swift Package を使って導入するのが圧倒的に 容易です。

追加したい Package / macro を含んでいる Swift Package

macro を使おうとしているので、macro を提供してくれる Package が必要です。

この記事では、以下の package を使います。

SDSMacros

上記の Package に含まれている IsCheckEnum という macro を使ってみます。

プロジェクトに Dependency として追加

他の Swift Package と同様に、プロジェクトに 追加します

  1. プロジェクトを Xcode で開く
  2. “File” – “Add Package Dependencies…” を選択
  3. 右上のフィールドに、Package の URL を入力
    AddPackageDependencies
  4. 右下の “Add Package” ボタンを押下
  5. “Choose Package Products for SDSMacros” で、Library を プロジェクトに 追加
    ChooseProduct
  6. プロジェクトに 追加される
    PackageAdded

上記の Step5 になって、プロジェクトの Package Dependencies に追加した Package が表示されていれば 準備は完了です。

macro は、swift-syntax に依存するのが普通なので、swift-syntax も表示されるのは普通です。

macro を使用

使用例を見せたいだけなので、ContentView.swift に追記してしまいます。

使いたい macro である IsCheckEnum は、enum で定義した case それぞれ用に is?? という case に一致しているかのメソッドを作成するマクロです。
つまり、enum に付与する Attached macro です。言い換えると、定義された enum が必要となります。

import する

他の Swift Package と同様に 使用するためには import する必要があります。

//
//  ContentView.swift
//
//  Created by : Tomoaki Yagishita on 2024/02/09
//  © 2024  SmallDeskSoftware
//

import SwiftUI
import Combine
import SDSMacros  // -- import !

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
        }
        .padding()
    }
}

#Preview {
    ContentView()
}

macro を使用する

enum に attach する macro なので、以下のように、MyEnum という enum を定義して 付与しています。

//
//  ContentView.swift
//
//  Created by : Tomoaki Yagishita on 2024/02/09
//  © 2024  SmallDeskSoftware
//

import SwiftUI
import Combine
import SDSMacros

@IsCheckEnum
enum MyEnum {
    case pattern1
    case pattern2
}

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
        }
        .padding()
    }
}

#Preview {
    ContentView()
}

Build してみて エラーが発生しなければ、macro は動作しているハズです。

macro を確認

動いているハズといっても、ケースによってはどのようなコードになっているか知りたいこともあります。

Xcode を使うことで、macro によって どのような コードが追加されているか確認することができます。

Xcode のエディタ上、 macro の位置で右クリックすると、以下のような context menu が表示されます。

ExpandMacroContext

“Expand Macro” を選択すると、以下のように、macro により処理されたコードが表示されるようになります。

macroExpanded

ここで、break point 等を設定することも可能です。

なお、左上の close button をクリックすると、非表示に戻せます。

まとめ

macro の使い方を改めて、確認しました。

macro の使い方
  • macro を提供する Swift Package を用意する
  • Dependency として プロジェクトに追加する
  • import を忘れずに
  • macro を使う
  • Context Menu の “Expand Macro” を使うと、macro を確認できる

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です