Objective-C و Swift: عالمين، مشروع واحد
\n\nأنت تكتب بلغة Swift، ولكن لديك مكتبة مكتوبة بلغة Objective-C، أو كود قديم لكنه موثوق بلغة ObjC. موقف مألوف؟ لا تقلق: لقد وفرت Apple آلية ممتازة للتعاون بين هاتين اللغتين. في هذه المقالة، سنشرح كيفية استدعاء كود Objective-C من Swift — بسرعة، وبساطة، وبدون صداع.
\n\nهذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow (آلاف المشاهدات ومئات الأصوات). وليس من دون سبب: القدرة على دمج Objective-C في Swift تفتح الباب أمام إرث ضخم من المكتبات والأكواد التي كُتبت على مدى عقود من تطوير iOS. دعنا أخيرًا نفهم كيف يعمل هذا.
\n\nما هو Bridging Header ولماذا هو مطلوب؟
\n\nسر التعاون بين Swift و Objective-C هو ملف خاص يسمى Bridging Header (الرأس الجسر). إنه بمثابة مترجم: يخبر Swift عن الكلاسات والدوال المتاحة في Objective-C وكيفية استدعائها بشكل صحيح.
\n\nعند إنشاء ملف الجسر، يلتقطه المترجم تلقائيًا ويجعل جميع التصريحات من Objective-C مرئية في Swift. كل ما عليك فعله هو استيراد رؤوس ObjC في هذا الملف — وسيكون الأمر جاهزًا.
\n\nكيفية إنشاء Bridging Header في Xcode
\n\nأسهل طريقة هي ترك Xcode يفعل ذلك نيابة عنك. ما عليك سوى إضافة ملف Objective-C جديد إلى المشروع (File → New → File → Objective-C File). سيسألك Xcode: "هل تريد إنشاء Bridging Header؟" — أجب بـ "نعم". بعد ذلك، سيظهر في المشروع ملف باسم YourProjectName-Bridging-Header.h.
إذا كنت تعمل بالفعل على مشروع وتريد إضافة الجسر يدويًا، فافعل ما يلي:
\n\n- \n
- أنشئ ملف رأس جديد (File → New → File → Header File) وسمّه، على سبيل المثال،
MyProject-Bridging-Header.h. \n - في إعدادات المشروع (Build Settings)، ابحث عن الخيار Objective-C Bridging Header وحدد المسار إلى ملفك. \n
أصبح جاهزًا. الآن، كل ما تكتبه في هذا الملف سيكون متاحًا في Swift.
\n\nكتابة كلاس Objective-C وربطه بـ Swift
\n\nلنقم بإنشاء كلاس بسيط بلغة Objective-C يقوم بتحية المستخدم. أولاً، ملف الرأس (Greeter.h):
// Greeter.h\n#import <Foundation/Foundation.h>\n\n@interface Greeter : NSObject\n\n- (NSString *)greetWithName:(NSString *)name;\n\n@end\n\n\nوالآن، التنفيذ (Greeter.m):
// Greeter.m\n#import "Greeter.h"\n\n@implementation Greeter\n\n- (NSString *)greetWithName:(NSString *)name {\n return [NSString stringWithFormat:@"مرحبًا، %@! سعيد بلقائك.", name];\n}\n\n@end\n\n\nالآن، الجزء الأهم. افتح ملف Bridging Header الخاص بك (على سبيل المثال، MyProject-Bridging-Header.h) وأضف إليه:
// MyProject-Bridging-Header.h\n#import "Greeter.h"\n\n\nتم! الآن يمكنك استخدام الكلاس Greeter في Swift كما لو كان مكتوبًا بلغة Swift:
// ViewController.swift\nimport UIKit\n\nclass ViewController: UIViewController {\n\n override func viewDidLoad() {\n super.viewDidLoad()\n \n let greeter = Greeter()\n let message = greeter.greet(withName: \"أحمد\")\n print(message) // سيطبع: "مرحبًا، أحمد! سعيد بلقائك."\n }\n}\n\n\nلاحظ: الطريقة greetWithName: تتحول في Swift إلى greet(withName:). هذا تكيف تلقائي لأسماء الطرق من Objective-C إلى أسلوب Swift.
العمل مع أطر عمل ومكتبات Objective-C
\n\nغالبًا ما تحتاج إلى ربط ليس كودك الخاص، بل مكتبة جاهزة بلغة Objective-C (مثل إصدار قديم من AFNetworking أو CocoaLumberjack). هنا الأمر أبسط:
\n\n- \n
- قم بتثبيت المكتبة عبر CocoaPods أو Carthage أو SPM. \n
- استورد رؤوسها في ملف Bridging Header الخاص بك. \n
- استخدم \n