كيفية استدعاء كود Objective-C من Swift: تعاون اللغات في iOS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

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\n
    \n
  • أنشئ ملف رأس جديد (File → New → File → Header File) وسمّه، على سبيل المثال، MyProject-Bridging-Header.h.
  • \n
  • في إعدادات المشروع (Build Settings)، ابحث عن الخيار Objective-C Bridging Header وحدد المسار إلى ملفك.
  • \n
\n\n

أصبح جاهزًا. الآن، كل ما تكتبه في هذا الملف سيكون متاحًا في Swift.

\n\n

كتابة كلاس Objective-C وربطه بـ Swift

\n\n

لنقم بإنشاء كلاس بسيط بلغة Objective-C يقوم بتحية المستخدم. أولاً، ملف الرأس (Greeter.h):

\n\n
// 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):

\n\n
// 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) وأضف إليه:

\n\n
// MyProject-Bridging-Header.h\n#import "Greeter.h"\n
\n\n

تم! الآن يمكنك استخدام الكلاس Greeter في Swift كما لو كان مكتوبًا بلغة Swift:

\n\n
// 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.

\n\n

العمل مع أطر عمل ومكتبات Objective-C

\n\n

غالبًا ما تحتاج إلى ربط ليس كودك الخاص، بل مكتبة جاهزة بلغة Objective-C (مثل إصدار قديم من AFNetworking أو CocoaLumberjack). هنا الأمر أبسط:

\n\n
    \n
  • قم بتثبيت المكتبة عبر CocoaPods أو Carthage أو SPM.
  • \n
  • استورد رؤوسها في ملف Bridging Header الخاص بك.
  • \n
  • استخدم
  • \n

المدونات

توصيات الكتب