objective-c - objective - swift 4 apple




كيفية استدعاء كود Objective-C من سويفت (9)

استخدام فئات Objective-C في Swift

** إذا كان لديك فصل دراسي موجود ترغب في استخدامه ، فعليك تنفيذ الخطوة 2 ثم انتقل إلى الخطوة 5 . (في بعض الحالات ، اضطررت لإضافة #import <Foundation/Foundation.h صريح #import <Foundation/Foundation.h إلى ملف Objective-C أقدم.) **

الخطوة 1: إضافة تطبيق Objective-C - .m

قم بإضافة ملف CustomObject.m إلى الفصل الدراسي الخاص بك ، ثم قم CustomObject.m .

الخطوة 2: إضافة رأس تجسير

عند إضافة ملف .m ، من المحتمل أن يتم توجيهك إلى مطالبة تبدو كالتالي:

انقر فوق نعم !

إذا لم تشاهد المطالبة ، أو قمت بحذف رأس الجسر الخاص بك بطريق الخطأ ، <#YourProjectName#>-Bridging-Header.h بإضافة ملف .h جديد إلى مشروعك واسمه <#YourProjectName#>-Bridging-Header.h .

في بعض الحالات ، خاصة عند العمل مع إطارات Objective-C ، لا تضيف فئة Objective-C صراحةً ولا يمكن لـ Xcode العثور على رابط. في هذه الحالة ، قم بإنشاء ملف .h الخاص بك كما هو مذكور أعلاه ، ثم تأكد من ربط مساره في إعدادات مشروع الهدف الخاص بك مثل:

ملحوظة

من أفضل الممارسات ربط مشروعك باستخدام الماكرو $(SRCROOT) بحيث إذا قمت بنقل مشروعك ، أو العمل عليه مع الآخرين باستخدام مستودع بعيد ، سيظل يعمل. يمكن اعتبار $(SRCROOT) كدليل يحتوي على ملف. xcodeproj الخاص بك. قد يبدو كالتالي:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

الخطوة 3: إضافة رأس Objective-C - .h

إضافة ملف .h آخر ثم اسم CustomObject.h .

الخطوة 4: بناء الفئة Objective-C

في CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

في CustomObject.m

#import "CustomObject.h"

@implementation CustomObject 

- (void) someMethod {
    NSLog(@"SomeMethod Ran");
}

@end

الخطوة 5: إضافة Class إلى Bridging-Header

في YourProject-Bridging-Header.h :

#import "CustomObject.h"

الخطوة 6: استخدم الكائن الخاص بك

في SomeSwiftFile.swift :

var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

ليست هناك حاجة لاستيراد صراحة ؛ هذا ما هو رأس جسر.

باستخدام فئات سويفت في Objective-C

الخطوة 1: إنشاء فئة سويفت جديدة

أضف ملف .swift إلى مشروعك ، ثم قم MySwiftObject.swift .

في MySwiftObject.swift :

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val"

    init() {}

    func someFunction(someArg:AnyObject) -> String {
        var returnVal = "You sent me \(someArg)"
        return returnVal
    }   
}

الخطوة 2: استيراد ملفات Swift إلى فئة ObjC

في SomeRandomClass.m :

#import "<#YourProjectName#>-Swift.h"

الملف: <#YourProjectName#>-Swift.h يجب أن يتم إنشاء <#YourProjectName#>-Swift.h تلقائيًا في مشروعك ، حتى إذا لم تتمكن من رؤيته.

الخطوة 3: استخدم صفك

MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);

ملحوظة:

1. CodeCompletion لم يكن يتصرف بدقة كما أريد. على نظامي ، يبدو أن تشغيل بنية سريعة باستخدام "cmd + r" يساعد سويفت في العثور على بعض الكود Objective-C والعكس بالعكس.

2. إذا قمت بإضافة ملف .swift إلى مشروع قديم وتحصل على الخطأ: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib ، جرب إعادة تشغيل Xcode تمامًا.

3. بينما كان من الممكن في الأصل استخدام فئات سويفت الخالصة في Objective-C باستخدام البادئة @objc ، بعد Swift 2.0 ، لم يعد ذلك ممكنًا. انظر تحرير التاريخ عن الشرح الأصلي. إذا تم إعادة تمكين هذه الوظيفة في إصدارات Swift المستقبلية ، فسيتم تحديث الإجابة وفقًا لذلك.

في لغة Swift الجديدة من Apple ، كيف يمكن للمرء أن يطلق على كود Objective-C؟

ذكرت شركة آبل أنها يمكن أن تتعايش في تطبيق واحد ، ولكن هل يعني هذا أنه يمكن للمرء من الناحية التقنية إعادة استخدام الطبقات القديمة التي تم إنشاؤها في Objective-C أثناء بناء صفوف جديدة في سويفت؟

السبب

Objective-C هي لغة مستقلة عن النظام الأساسي ، في حين أن Swift تعتمد على النظام الأساسي. ومن ثم ، لن يكون من الحكمة كتابة الكود الذي لا يعتمد على النظام الأساسي (مكتبات المنطق التجارية) في سويفت. ومع ذلك ، فإن كتابة التعليمات البرمجية التي تعتمد على النظام الأساسي في ذلك (واجهة ذات الصلة على سبيل المثال) سيكون على ما يرام تماما. لا يعني أنها ستكون فكرة جيدة ، إلا أنها بالتأكيد مصلحة.


شيء آخر أود إضافته هنا:

أنا ممتن جدا لرد @ لوجان. يساعد الكثير على إنشاء ملف الجسر وإعدادات.

ولكن بعد القيام بكل هذه الخطوات ما زلت لا أحصل على فئة Objective-C في سويفت.

استخدمت مكتبة cocoapods في مشروعي. وهو pod "pop" .

لذا إذا كنت تستخدم برامج Objective-C في Swift ، فقد تكون هناك فرصة لعدم تمكنك من الحصول على الطبقات أو import إلى Swift.

الشيء البسيط الذي عليك فعله هو:

  1. انتقل إلى <YOUR-PROJECT>-Bridging-Header file and
  2. استبدل العبارة #import <ObjC_Framework> بـ @import ObjC_Framework

على سبيل المثال: (مكتبة البوب)

يحل محل

#import <pop/POP.h>

مع

@import pop;

استخدم clang import عندما لا يعمل #import .


اقتبس من الوثائق :

يمكن استيراد أي إطار Objective-C (أو مكتبة C) التي يمكن الوصول إليها كوحدة نمطية مباشرة إلى Swift. يتضمن ذلك جميع إطارات نظام Objective-C - مثل Foundation و UIKit و SpriteKit - بالإضافة إلى مكتبات C الشائعة المزودة بالنظام. على سبيل المثال ، لاستيراد Foundation ، ما عليك سوى إضافة عبارة الاستيراد هذه إلى أعلى ملف Swift الذي تعمل فيه:

import Foundation

يجعل هذا الاستيراد جميع واجهات برمجة التطبيقات الأساسية - بما في ذلك NSDate و NSURL و NSMutableData وكل أساليبها وخصائصها وفئاتها - متاحة بشكل مباشر في Swift.


انظر دليل أبل لاستخدام سويفت مع الكاكاو و Objective-C . يغطي هذا الدليل كيفية استخدام Objective-C و C code من Swift والعكس صحيح ويتضمن توصيات حول كيفية تحويل مشروع أو مزج ومطابقة أجزاء Objective-C / C و Swift في مشروع موجود.

ينشئ المحول البرمجي تلقائياً بناء جملة Swift لاستدعاء C دالات وطرق Objective-C. كما رأينا في الوثائق ، وهذا الهدف C:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

يتحول إلى رمز Swift هذا:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

تقوم Xcode أيضًا بهذه الترجمة بسرعة - يمكنك استخدام Open Quickly أثناء تحرير ملف Swift واكتب اسم الفئة Objective-C ، وستأخذك إلى إصدار Swift-ified لرأس الفئة. (يمكنك أيضًا الحصول على هذا عن طريق النقر فوق cmd على رمز واجهة برمجة التطبيقات في ملف Swift.) وجميع الوثائق المرجعية API في مكتبات مطوري نظامي iOS 8 و OS X v10.10 (Yosemite) مرئية في كل من Objective-C و Swift النماذج (على سبيل المثال UIView ).


بعد إنشاء رأس Bridging ، انتقل إلى Build Setting => Search for "Objectid-C Bridging Header".

فقط أدناه ستجد ملف "" Headive Name Generated Interface Name "".

استيراد هذا الملف في جهاز العرض الخاص بك.

مثال: في حالتي: "Dauble-Swift.h"


فيما يلي إرشادات خطوة بخطوة لاستخدام كود Objective-C (في هذه الحالة ، إطار عمل يقدمه طرف ثالث) في مشروع Swift:

  1. أضف أي ملف Objective-C إلى مشروع Swift الخاص بك باختيار File -> New -> New File -> Objective-C File. عند الحفظ ، سيسألك Xcode عما إذا كنت تريد إضافة رأس تجسير . اختر " نعم ". Gif: إضافة ملف فارغ للمشروع وتوليد رأس تجسير http://www.derrrick.com//1-empty-file.gif

في خطوات بسيطة:

  1. تظهر مطالبة ، ثم انقر فوق موافق ... إذا لم تظهر ، فسننشئها يدويًا كما يلي في ما يلي ... قم بإنشاء ملف رأس واحد من مصدر iOS وأعط اسم ProjectName-Bridging-Header (مثال: اختبار -Bridging-Header) ، ثم انتقل إلى إنشاء الإعداد في رمز برنامج التحويل البرمجي Swift -> Objective-C bridge add Objective-C bridge name .. (Test / Test-Bridging-Header.h). نعم ، هذا كامل.

  2. بشكل اختياري ، قم بحذف الملف Objective-C الذي قمت بإضافته (المسمى "أي شيء" في صورة GIF أعلاه). لا تحتاجها أكثر من ذلك.

  3. فتح ملف رأس سد - اسم الملف من النموذج [YourProject] -Bridging-Header.h . ويشمل التعليق المقدمة Xcode. أضف سطرًا من التعليمات البرمجية لملف Objective-C الذي تريد تضمينه ، مثل إطار جهة خارجية. على سبيل المثال ، لإضافة Mixpanel إلى مشروعك ، ستحتاج إلى إضافة سطر التعليمة البرمجية التالي إلى ملف الرأس التجسيمي:

    #import "Mixpanel.h"
  4. الآن في أي ملف Swift يمكنك استخدام كود Objective-C الموجود ، في بناء جملة Swift (في حالة هذا المثال ، ويمكنك استدعاء أساليب Mixpanel SDK ، الخ). تحتاج إلى التعرف على كيفية ترجمة Xcode Objective-C إلى Swift. دليل أبل هو قراءة سريعة. أو انظر هذه الإجابة للحصول على ملخص غير كامل.

مثال على Mixpanel:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

هذا هو!

ملاحظة: إذا قمت بإزالة ملف رأس سد من مشروعك ، تأكد من الدخول إلى "إعدادات البناء" وإزالة قيمة " رأس Bridging Objective-C " تحت عنوان "Swift Compiler - إنشاء الكود".


مجرد ملاحظة لمن يحاول إضافة مكتبة Objective-C إلى Swift: يجب عليك إضافة -ObjC في إعدادات البناء -> ربط -> إشارات رابط أخرى .


يمكن استيراد أي إطار Objective-C (أو مكتبة C) التي يمكن الوصول إليها كوحدة نمطية مباشرة إلى Swift. يتضمن ذلك جميع إطارات نظام Objective-C - مثل Foundation و UIKit و SpriteKit - بالإضافة إلى مكتبات C الشائعة المزودة بالنظام. على سبيل المثال ، لاستيراد Foundation ، ما عليك سوى إضافة عبارة الاستيراد هذه إلى أعلى ملف Swift الذي تعمل فيه:

import Foundation

يجعل هذا الاستيراد جميع واجهات برمجة التطبيقات الأساسية - بما في ذلك NSDate و NSURL و NSMutableData وكل أساليبها وخصائصها وفئاتها - متاحة بشكل مباشر في Swift.

لقد أخذت هذا من وثائق شركة آبل.


اتجاهين النهج لاستخدام الهدف ج الهدف

1

1. Create bridge-header.h file in Xcode Project
2. import .h file in bridge-Header file
3. Set path of bridge-Header in Build settings. 
3. Clean the Project 

2

  1. Create objective-c files in project(it automatically set path in Build Settings for you )
  2. import .h file in bridge-Header file

الآن جيد أن أذهب شكرا





swift