0Pricing
Swift Academy · บทเรียน

เขียนมาโครนิพจน์แบบอิสระ

ใช้งานมาโคร #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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. บทบาทของมาโคร: แบบอิสระและแบบแนบ
  2. เขียนมาโครนิพจน์แบบอิสระ
  3. มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป
  4. การทดสอบและแก้จุดบกพร่องมาโคร
← กลับไปที่ Swift Academy