Swift Macros vs Sourcery مقارنة
ماكروهات أصلية وقت الترجمة في Swift 5.9+
VS
Sourcery
أداة توليد كود خارجية لـ Swift (قائمة على Stencil)
8 دقائق للقراءةiOS
مقارنة الدرجات
جارٍ تحميل الرسم البياني...
التقييم التفصيلي
| الفئة | Swift Macros | Sourcery |
|---|---|---|
| الأداء | 9/10 | 7/10 |
| سهولة التعلّم | 7/10 | 8/10 |
| النظام البيئي | 8/10 | 8/10 |
| المجتمع | 8/10 | 9/10 |
| سوق العمل | 8/10 | 6/10 |
| الاستدامة المستقبلية | 10/10 | 6/10 |
الإيجابيات والسلبيات
Swift Macros
الإيجابيات
- أصلي في مترجم Swift — تكامل مثالي
- آمن الأنواع، أخطاء الصياغة تظهر وقت الترجمة
- دعم بيئة التطوير (إكمال تلقائي وتنقل في Xcode)
- ماكروهات مدمجة مثل @Observable وQuery وPreview#
- منتشرة في SwiftUI وSwiftData وإطار عمل الاختبار (Testing)
- آمنة للتزامن (async-safe)، آمنة للخيوط
- مستقلة عن المنصة (iOS، macOS، Linux)
- مستقبلية — Apple تروّج لها رسميًا
السلبيات
- Swift 5.9+ فقط (Xcode 15+)
- منحنى تعلم يتطلب معرفة بواجهة برمجة تطبيقات SwiftSyntax
- التصحيح صعب — يتطلب #expand لرؤية توسيع الماكرو
- يضيف وقتًا للبناء (البناء الأول)
الأنسب لـ
مشاريع Swift 5.9+ الجديدةمشاريع SwiftUI وSwiftDataمطورو المكتبات/أطر العملإنشاء لغات خاصة بمجال (DSL) آمنة الأنواعالنمط الرسمي من Apple (إطار عمل الاختبار)
Sourcery
الإيجابيات
- متوافقة مع Swift 5.0+ (المشاريع القديمة)
- مرحلة بناء خارجية — ليست وقت التشغيل
- قالب Stencil — بديهي
- تعليقات توضيحية مدمجة مثل AutoMockable وAutoLenses وAutoEquatable
- مدمجة مع Xcode (سكريبت مرحلة البناء)
- قوالب مجتمعية واسعة
- الكود المُولَّد محفوظ في git (قابل للفحص)
- دعم موسّع للمحاكاة (mocking)
السلبيات
- تبعية خارجية (الماكروهات أصلية في Swift)
- تضيف مرحلة بناء — لا تكامل أنظف
- الملفات المُولَّدة موجودة في المستودع — ضجيج في المراجعة
- قيود نظام أنواع Swift (أضعف من الماكروهات)
الأنسب لـ
مشاريع Swift القديمة (5.0-5.8)محاكاة موسّعة (مجموعة اختبارات)تقليل الكود المتكرر عبر الفرقأنماط توليد محددة (Lens، Equatable)جسر قبل الترحيل
مقارنة الكود
Swift Macros
@freestanding(expression)
public macro Color(_ hex: String) -> Color = #externalMacro(
module: "MyMacros",
type: "ColorFromHexMacro"
)
// الاستخدام:
let primary = #Color("#4A90E2")
// توسيع وقت الترجمة → UIColor(red: 0.29, green: 0.56, ...)Sourcery
// تعليق توضيحي Sourcery
// sourcery: AutoMockable
protocol UserService {
func fetchUser(id: String) async throws -> User
func updateUser(_ user: User) async throws
}
// مُولَّد تلقائيًا — MockUserService.generated.swift:
// class MockUserService: UserService { ... }الخلاصة
لمشروع Swift 5.9+ جديد → الماكروهات إلزامية (أصلية، مستقبلية). للمشاريع القديمة (5.0-5.8) → Sourcery عملي. الترحيل: أخرِج Sourcery تدريجيًا وانتقل إلى الماكروهات. في 2027 سيصبح استخدام Sourcery نادرًا.
احصل على استشارة مجانيةالأسئلة الشائعة
الأسئلة الشائعة
نعم، الماكروهات كأساسي + Sourcery للمحاكاة (mocking) بنهج هجين. لكن الأمثل استخدام أداة واحدة.