Swift Academy · บทเรียน

บทบาทของมาโคร: แบบอิสระและแบบแนบ

ทำความเข้าใจมาโคร #expression และบทบาทของมาโคร @attached แบบ peer/member/accessor

บทเรียน 1 จาก 413 ขั้นตอน

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

มาโครของ Swift คืออะไร

มาโครของ Swift จะขยายซอร์สโค้ดขณะคอมไพล์ และสร้างโค้ดส่วนซ้ำซ้อนโดยอัตโนมัติโดยไม่มีค่าใช้จ่ายขณะทำงาน

// Macros are invoked with # (freestanding) or @ (attached)
#warning("Fix this later")
@Observable class Counter { var count = 0 }

มาโครนิพจน์แบบอิสระ

มาโครนิพจน์แบบอิสระเริ่มต้นด้วย # และสร้างค่า หรือดำเนินการที่มีผลข้างเคียง

// #stringify expands to a tuple of the value and its source string
let (val, src) = #stringify(1 + 2)
print(val, src) // 3, "1 + 2"

มาโครการประกาศแบบอิสระ

มาโครการประกาศแบบอิสระจะสร้างการประกาศใหม่ เช่น ฟังก์ชันหรือตัวแปร ณ ตำแหน่งที่เรียกใช้

// #makePair emits two variables
#makePair("point", x: 1, y: 2)
// expands to: let pointX = 1; let pointY = 2

มาโครสมาชิกแบบแนบ

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

@AddID
struct User { var name: String }
// Expands to: var id = UUID()

มาโครตัวเข้าถึงแบบแนบ

มาโคร @accessor แบบแนบจะสร้างการทำงานของตัวอ่านและตัวกำหนดค่าสำหรับพร็อพเพอร์ตีที่จัดเก็บ

struct Point {
  @Clamped(0...100)
  var x: Int = 0
  // accessor macro generates get/set with clamping
}

มาโครเพื่อนร่วมระดับแบบแนบ

มาโครเพื่อนร่วมระดับจะเพิ่มการประกาศระดับเดียวกันถัดจากการประกาศที่มาโครแนบอยู่

class Service {
  @AddAsync
  func fetchSync(completion: @escaping (Data)->Void) { ... }
  // peer macro adds: func fetch() async -> Data
}

มาโครความสอดคล้องแบบแนบ

มาโครความสอดคล้องจะเพิ่มความสอดคล้องกับโพรโทคอล รวมถึงการทำงานที่จำเป็นให้กับชนิดข้อมูล

@EquatableByID
struct Product { var id: Int; var name: String }
// adds: extension Product: Equatable { ... }

มาโครส่วนขยายแบบแนบ

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

@CustomCodable
struct Config { var host: String; var port: Int }
// adds: extension Config: Codable { custom encode/decode }

การขยายมาโครเกิดขึ้นขณะคอมไพล์

การขยายมาโครทั้งหมดเกิดขึ้นระหว่างการคอมไพล์ จึงไม่มีต้นทุนขณะทำงาน และสามารถดูโค้ดที่ขยายแล้วได้ใน Xcode

// Right-click macro usage in Xcode → "Expand Macro"
// to see the generated source code

การประกาศมาโคร

มาโครจะประกาศในเป้าหมายมาโครแยกต่างหาก โดยใช้แอตทริบิวต์ @freestanding หรือ @attached

@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
  = #externalMacro(module: "MyMacros", type: "StringifyMacro")

สรุปบทบาทของมาโคร

แบบอิสระ: #expression, #declaration แบบแนบ: @member, @accessor, @peer, @conformance, @extension

// Freestanding
let result = #stringify(40 + 2)
// Attached
@Observable class Model { var count = 0 }

ตรวจสอบความเข้าใจ

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

ทบทวนบทเรียน

มาโครแบบอิสระ (#name) สร้างค่าหรือการประกาศ มาโครแบบแนบ (@name) เพิ่มสมาชิก ตัวเข้าถึง ความสัมพันธ์ระดับเดียวกัน ความสอดคล้องกับโพรโทคอล หรือส่วนขยายให้กับชนิดข้อมูล การขยายทั้งหมดเกิดขึ้นขณะคอมไพล์

เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

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

บทเรียน “บทบาทของมาโคร: แบบอิสระและแบบแนบ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “บทบาทของมาโคร: แบบอิสระและแบบแนบ”

ทำความเข้าใจมาโคร #expression และบทบาทของมาโคร @attached แบบ peer/member/accessor คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “บทบาทของมาโคร: แบบอิสระและแบบแนบ” ใช้เวลานานแค่ไหน

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

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

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

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

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