كتابة ماكرو تعبير مستقل
نفّذوا ماكرو #stringify بسيطًا باستخدام SwiftSyntax وMacroExpansion.
كتابة ماكرو تعبير مستقل درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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().
الأسئلة الشائعة
هل درس «كتابة ماكرو تعبير مستقل» مجاني؟
نعم — نص درس «كتابة ماكرو تعبير مستقل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «كتابة ماكرو تعبير مستقل»؟
نفّذوا ماكرو #stringify بسيطًا باستخدام SwiftSyntax وMacroExpansion. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «كتابة ماكرو تعبير مستقل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أدوار الماكرو: مستقل مقابل ملحق
- كتابة ماكرو تعبير مستقل
- ماكروهات الأعضاء الملحقة لتقليل الشيفرة المتكررة
- اختبار الماكروهات وتصحيحها