เขียนมาโครนิพจน์แบบอิสระ
ใช้งานมาโคร #stringify อย่างง่ายด้วย SwiftSyntax และ MacroExpansion
เขียนมาโครนิพจน์แบบอิสระ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
การตั้งค่าโครงการ
มาโครอยู่ในเป้าหมายของแพ็กเกจ Swift ที่แยกต่างหากและมีชนิดเป็น .macro โดยใช้ SwiftSyntax
// Package.swift (excerpt)
.macro(
name: "MyMacros",
dependencies: [
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
)การประกาศมาโคร
ประกาศลายเซ็นของมาโครในเป้าหมายไลบรารี เพื่อให้โค้ดผู้ใช้สามารถเรียกใช้ได้
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
= #externalMacro(module: "MyMacros", type: "StringifyMacro")การนำชนิดมาโครไปใช้งาน
นำมาโครไปใช้งานโดยทำให้สอดคล้องกับ ExpressionMacro และคืนค่าเป็น 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))"
}
}การลงทะเบียนปลั๊กอิน
สร้าง CompilerPlugin ที่แสดงรายการมาโครทั้งหมดในแพ็กเกจ
import SwiftCompilerPlugin
@main
struct MyPlugin: CompilerPlugin {
let providingMacros: [Macro.Type] = [
StringifyMacro.self
]
}การใช้มาโคร
นำเข้าไลบรารีมาโคร แล้วเรียกใช้ด้วย #stringify
import MyMacros
let (value, source) = #stringify(2 + 3)
print(value) // 5
print(source) // "2 + 3"การสร้าง ExprSyntax
ค่าที่คืนกลับมาจะสร้างขึ้นโดยใช้การแทรกสตริงบน ExprSyntax ซึ่งอาศัยความปลอดภัยของชนิดข้อมูลจาก SwiftSyntax
// The expansion returns a tuple literal
return "((\(arg)), \(literal: arg.description))"การเข้าถึงอาร์กิวเมนต์ของมาโคร
เข้าถึงอาร์กิวเมนต์ผ่าน node.arguments ซึ่งเป็นรายการของนิพจน์ที่มีป้ายกำกับ
let args = node.arguments
for arg in args {
print(arg.label?.text ?? "_", arg.expression)
}การสร้างข้อความวินิจฉัย
ส่งคำเตือนหรือข้อผิดพลาดของคอมไพเลอร์จากมาโครโดยใช้บริบทการขยาย
context.diagnose(Diagnostic(
node: node,
message: MyDiagnostic.missingArgument
))โหนดไวยากรณ์ของ SwiftSyntax
SwiftSyntax แทนโครงสร้างทุกอย่างของภาษาเป็นโหนดไวยากรณ์ที่มีชนิดข้อมูล ซึ่งคุณสามารถตรวจสอบและสร้างได้
import SwiftSyntax
let expr: ExprSyntax = "1 + 2"
print(type(of: expr)) // BinaryOperatorExprSyntaxการป้องกันการชนกันของชื่อในมาโคร
มาโครของ Swift ป้องกันการชนกันของชื่อโดยค่าเริ่มต้น ชื่อที่สร้างขึ้นจะไม่ชนกับชื่อในขอบเขตของจุดเรียกใช้
// Macro-generated variables get unique names internally
// preventing accidental shadowing in user codeการขยายมาโครใน Xcode
คลิกขวาที่การเรียกใช้มาโครใด ๆ ใน Xcode แล้วเลือก ขยายมาโคร เพื่อตรวจสอบซอร์สโค้ดที่สร้างขึ้น
#stringify(40 + 2)
// Xcode expands to: (40 + 2, "40 + 2")ตรวจสอบความเข้าใจ
การนำมาโครนิพจน์ไปใช้งานต้องทำให้สอดคล้องกับโพรโทคอลใด
ทบทวนบทเรียน
เขียนมาโครนิพจน์แบบอิสระโดยประกาศด้วย @freestanding(expression) นำ ExpressionMacro ไปใช้งานในเป้าหมาย .macro ลงทะเบียนผ่าน CompilerPlugin และเรียกใช้ด้วย #macroName()
คำถามที่พบบ่อย
บทเรียน “เขียนมาโครนิพจน์แบบอิสระ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เขียนมาโครนิพจน์แบบอิสระ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เขียนมาโครนิพจน์แบบอิสระ”
ใช้งานมาโคร #stringify อย่างง่ายด้วย SwiftSyntax และ MacroExpansion คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “เขียนมาโครนิพจน์แบบอิสระ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- บทบาทของมาโคร: แบบอิสระและแบบแนบ
- เขียนมาโครนิพจน์แบบอิสระ
- มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป
- การทดสอบและแก้จุดบกพร่องมาโคร