Menulis Macro Ekspresi Freestanding
Mengimplementasikan macro #stringify sederhana dengan SwiftSyntax dan MacroExpansion.
Menulis Macro Ekspresi Freestanding adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.
Penyiapan Proyek
Makro berada dalam target paket Swift terpisah dengan jenis .macro, menggunakan SwiftSyntax.
// Package.swift (excerpt)
.macro(
name: "MyMacros",
dependencies: [
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
)Deklarasi Makro
Deklarasikan tanda tangan makro dalam target pustaka agar klien dapat memanggilnya.
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
= #externalMacro(module: "MyMacros", type: "StringifyMacro")Mengimplementasikan Tipe Makro
Implementasikan makro dengan mematuhi ExpressionMacro dan mengembalikan ExprSyntax.
import SwiftSyntaxMacros
import SwiftSyntax
struct StringifyMacro: ExpressionMacro {
static func expansion(
of node: some FreestandingMacroExpansionSyntax,
in context: some MacroExpansionContext
) throws -> ExprSyntax {
guard let arg = node.arguments.first?.expression else {
throw MacroError.message("Need an argument")
}
return "(\(arg), \(literal: arg.description))"
}
}Mendaftarkan Plug-in
Buat CompilerPlugin yang mencantumkan semua makro dalam paket.
import SwiftCompilerPlugin
@main
struct MyPlugin: CompilerPlugin {
let providingMacros: [Macro.Type] = [
StringifyMacro.self
]
}Menggunakan Makro
Impor pustaka makro dan panggil dengan #stringify.
import MyMacros
let (value, source) = #stringify(2 + 3)
print(value) // 5
print(source) // "2 + 3"Membangun ExprSyntax
Nilai hasil dibangun menggunakan interpolasi teks pada ExprSyntax, dengan memanfaatkan keamanan tipe dari SwiftSyntax.
// The expansion returns a tuple literal
return "((\(arg)), \(literal: arg.description))"Mengakses Argumen Makro
Argumen diakses melalui node.arguments, yang merupakan daftar ekspresi berlabel.
let args = node.arguments
for arg in args {
print(arg.label?.text ?? "_", arg.expression)
}Menghasilkan Diagnostik
Hasilkan peringatan atau error compiler dari makro menggunakan konteks ekspansi.
context.diagnose(Diagnostic(
node: node,
message: MyDiagnostic.missingArgument
))Simpul Sintaksis SwiftSyntax
SwiftSyntax merepresentasikan setiap konstruksi bahasa sebagai simpul sintaksis bertipe yang dapat Anda periksa dan bangun.
import SwiftSyntax
let expr: ExprSyntax = "1 + 2"
print(type(of: expr)) // BinaryOperatorExprSyntaxHigiene Makro
Makro Swift secara bawaan bersifat higienis: nama yang dihasilkan tidak akan bertabrakan dengan nama dalam lingkup pemanggil.
// Macro-generated variables get unique names internally
// preventing accidental shadowing in user codeMemperluas Makro di Xcode
Klik kanan pemanggilan makro apa pun di Xcode, lalu pilih Luaskan Makro untuk memeriksa kode sumber yang dihasilkan.
#stringify(40 + 2)
// Xcode expands to: (40 + 2, "40 + 2")Pemeriksaan Singkat
Protokol apa yang harus dipatuhi oleh implementasi makro ekspresi?
Ringkasan Pelajaran
Tulis makro ekspresi mandiri dengan cara mendeklarasikannya menggunakan @freestanding(expression), mengimplementasikan ExpressionMacro dalam target .macro, mendaftarkannya melalui CompilerPlugin, lalu memanggilnya dengan #macroName().
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menulis Macro Ekspresi Freestanding” gratis?
Ya — teks lengkap “Menulis Macro Ekspresi Freestanding” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menulis Macro Ekspresi Freestanding”?
Mengimplementasikan macro #stringify sederhana dengan SwiftSyntax dan MacroExpansion. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Swift Academy?
Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Menulis Macro Ekspresi Freestanding” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?
Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Peran Macro: Freestanding vs Attached
- Menulis Macro Ekspresi Freestanding
- Macro Member Attached untuk Mengurangi Boilerplate
- Menguji dan Men-debug Macro