Swift Academy · レッスン

ボイラープレートを削減するアタッチドメンバーマクロ

メンバーマクロでinit、CodingKeys、Equatable適合を自動生成します。

レッスン 3/413 ステップ

「ボイラープレートを削減するアタッチドメンバーマクロ」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

メンバーマクロの概要

アタッチドメンバーマクロは、装飾された型に新しいメンバー(プロパティ、メソッド、init)を直接生成します。

@AddID
struct User { var name: String }
// After expansion:
// struct User { var name: String; var id = UUID() }

MemberMacroに準拠する

MemberMacroを実装し、新しいメンバーを表すDeclSyntaxの配列を返します。

import SwiftSyntaxMacros

struct AddIDMacro: MemberMacro {
  static func expansion(
    of node: AttributeSyntax,
    providingMembersOf decl: some DeclGroupSyntax,
    in context: some MacroExpansionContext
  ) throws -> [DeclSyntax] {
    return ["var id = UUID()"]
  }
}

initを生成する

メンバーマクロは、必要に応じてカスタムイニシャライザーを生成し、メンバーワイズinitを置き換えられます。

// Macro expansion returns:
[
  "init(name: String) { self.name = name; self.id = UUID() }"
]

@Observableマクロの内部

Swift組み込みの@Observableはメンバーマクロを使用して、クラスに監視のための基盤を追加します。

@Observable
class Counter {
  var count = 0
  // macro adds: _$observationRegistrar, access(), withMutation()
}

装飾された型を読み取る

declパラメーターを通して装飾された型のプロパティにアクセスし、コンテキストに応じたメンバーを生成します。

if let structDecl = decl.as(StructDeclSyntax.self) {
  let members = structDecl.memberBlock.members
  // iterate to inspect stored properties
}

storedプロパティを抽出する

メンバーの一覧を、storedプロパティのパターンを持つ変数宣言に絞り込み、コード生成に利用します。

let storedProps = members.compactMap { member -> VariableDeclSyntax? in
  guard let varDecl = member.decl.as(VariableDeclSyntax.self),
        varDecl.bindingSpecifier.tokenKind == .keyword(.var)
  else { return nil }
  return varDecl
}

メンバーからEquatableを生成する

@AutoEquatableマクロは、各storedプロパティを比較することで==を生成できます。

// Generated code:
static func == (lhs: User, rhs: User) -> Bool {
  lhs.name == rhs.name && lhs.id == rhs.id
}

メンバーマクロと準拠マクロを組み合わせる

メンバーの追加とプロトコル準拠の宣言を同時に行うために、MemberMacroとConformanceMacroを組み合わせることがよくあります。

struct AutoEquatableMacro: MemberMacro, ConformanceMacro { ... }

属性の引数

マクロに引数を受け取らせ、生成するコードをカスタマイズできます。

@Clamped(range: 0...100)
var score: Int = 50
// macro reads range from attribute node and generates clamping accessors

マクロのエラー報告

マクロが誤って使用された場合は、MacroExpansionErrorをスローするか、診断情報を出力します。

guard decl.is(StructDeclSyntax.self) else {
  throw MacroError.message("@AddID can only be applied to structs")
}

ビルドパフォーマンス

展開はコンパイル時に行われるため、メンバーマクロによる実行時オーバーヘッドはゼロで、生成されたコードはキャッシュ可能です。

// All generated members are emitted as source code
// and compiled normally — no reflection at runtime

理解度チェック

アタッチドメンバーマクロは、どのプロトコルに準拠する必要がありますか。

レッスンのまとめ

メンバーマクロ(MemberMacro)は、装飾する型にstoredプロパティ、computedプロパティ、イニシャライザーを生成します。型が既に持つメンバーを読み取り、コンテキストに応じたコードを生成します。ConformanceMacroと組み合わせると、プロトコル準拠も追加できます。

無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「ボイラープレートを削減するアタッチドメンバーマクロ」レッスンは無料ですか?

はい。「ボイラープレートを削減するアタッチドメンバーマクロ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「ボイラープレートを削減するアタッチドメンバーマクロ」で何を学びますか?

メンバーマクロでinit、CodingKeys、Equatable適合を自動生成します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ボイラープレートを削減するアタッチドメンバーマクロ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. マクロの役割:フリースタンディングとアタッチド
  2. フリースタンディング式マクロの記述
  3. ボイラープレートを削減するアタッチドメンバーマクロ
  4. マクロのテストとデバッグ
← Swift Academyに戻る