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