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

มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป

สร้าง init, CodingKeys หรือการสอดคล้องกับ Equatable โดยอัตโนมัติด้วยมาโครสมาชิก

มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

ภาพรวมมาโครสมาชิก

มาโครสมาชิกแบบแนบจะสร้างสมาชิกใหม่ เช่น พร็อพเพอร์ตี เมธอด และตัวเริ่มต้น ให้กับชนิดข้อมูลที่ตกแต่งโดยตรง

@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()"]
  }
}

การสร้างตัวเริ่มต้น

มาโครสมาชิกสามารถสร้างตัวเริ่มต้นแบบกำหนดเอง เพื่อแทนที่ตัวเริ่มต้นแบบสร้างจากสมาชิกเมื่อจำเป็น

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

ภายในมาโคร @Observable

@Observable ที่มีมาให้ใน Swift ใช้มาโครสมาชิกเพื่อเพิ่มโครงสร้างพื้นฐานสำหรับการสังเกตการเปลี่ยนแปลงให้กับคลาสของคุณ

@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
}

การแยกพร็อพเพอร์ตีที่จัดเก็บ

กรองรายการสมาชิกเพื่อหาการประกาศตัวแปรที่มีรูปแบบของพร็อพเพอร์ตีที่จัดเก็บ แล้วนำไปใช้สร้างโค้ด

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 สามารถสร้าง == โดยเปรียบเทียบพร็อพเพอร์ตีที่จัดเก็บแต่ละรายการ

// 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) สร้างพร็อพเพอร์ตีที่จัดเก็บ พร็อพเพอร์ตีที่คำนวณ และตัวเริ่มต้นให้กับชนิดข้อมูลที่มาโครนำไปใช้ อ่านสมาชิกที่มีอยู่ของชนิดข้อมูลเพื่อสร้างโค้ดที่ปรับตามบริบท และใช้ร่วมกับ ConformanceMacro เพื่อเพิ่มความสอดคล้องกับโพรโทคอลด้วย

คำถามที่พบบ่อย

บทเรียน “มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป”

สร้าง init, CodingKeys หรือการสอดคล้องกับ Equatable โดยอัตโนมัติด้วยมาโครสมาชิก คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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