دليل خطوة بخطوة لتحويل تطبيق Full Objective-C إلى Swift

نشرت: 2018-03-14

منذ إصدارها في عام 2014 ، شهدت لغة برمجة Apple Swift نموًا هائلاً. تمكنت لغة البرمجة من جعل مكانها في الأعمال الروتينية لأفضل 10 لغات برمجة ، حيث شاركت الموقع مع سابقتها ، Objective-C. لكن حرب سويفت ضد الهدف سي لا تتلاشى أبدًا.

مع هذا الارتفاع في الشعبية والميزات المثيرة ، تحول الكثير من مطوري تطبيقات iOS الذين كانوا يعملون سابقًا مع Obj-C إلى لغة برمجة Swift. في الواقع ، ضمن معركة swift أو Objective-C لنظام iOS ، تمت ترقية تطبيقات iOS المختلفة مثل LinkedIn و Yahoo Weather و Hipmunk و Lyft من Objective-C إلى Swift ، بينما يخطط الكثيرون لتحويل تطبيق Objective-C إلى Swift.

العوامل التي تجعل السويفت خيارًا أفضل

شخصيًا ، لقد رأيت تطور Swift منذ الكشف عن نسختها الأولى ويمكنني القول أنه بين swift و C ، Swift يحل محل Objective-C بناءً على عوامل ، مثل

المصدر المفتوح

Swift هي لغة مفتوحة المصدر ويمكن أن تكون الشفرة السريعة محمولة على العديد من الأنظمة الأساسية أكثر مما كانت عليه Objective-C في أي وقت مضى.

سرعة

Swift for iOS هي لغة مكتوبة ثابتة تعمل مع مترجم LLVM ويمكنها إعادة استخدام الكود الحالي ، والقضاء على الموارد غير المستخدمة ، وإدارة الوظائف المضمنة ، وما إلى ذلك. إلى جانب ذلك ، يعتمد عملها على واحدة من أسرع العمليات الحسابية لحساب الخوارزمية C ++ والتي بدورها تثبت أنها تتمتع بميزة تنافسية على سابقتها.

وفقًا لما تدعي شركة Apple وأنا من تجربته ، فإن خوارزمية Swift للبحث أسرع 2.6 مرة من Objective-C.

مقروئية

على عكس Objective-C ، فإن Swift غير مرتبط بأسس C. إنه يمكّن مطوري iOS من إزالة استدعاءات الطريقة المتداخلة ، وتخطي الفاصلة المنقوطة في نهاية السطر ، وتجنب وضع @ في بداية الكلمة الأساسية ، وسلسلة السلسلة باستخدام علامة "+" ، وما إلى ذلك. علاوة على ذلك ، لا يتم تقسيم فئة Swift إلى أجزاء ، والواجهة والتنفيذ. أدى هذا إلى تقليل طول الرمز إلى النصف تقريبًا ، مما يجعله أكثر قابلية للقراءة.

على سبيل المثال ، عندما تمت إعادة كتابة تطبيق Lyft بلغة Swift من البداية ، انخفض رمز التطبيق من 75000 إلى 25000 سطر. قطعت هذه الأرقام الرائعة جهود المطورين دون التأثير على أداء التطبيق لدى العميل.

الترميز التفاعلي

بفضل ميزة Playgrounds الخاصة به ، فإنها تتيح للمبرمجين كتابة جزء من التعليمات البرمجية أو الخوارزمية أثناء جمع التعليقات على طول مرحلة التطوير. نظرًا لأن رمز Swift مكتوب باستخدام تصورات البيانات ، فإن هذا يجعل عملية تطوير التطبيق أسهل ويمكن الوصول إليها.

أمان

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

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

اعمال صيانة

نظرًا لأن Swift لا تعتمد على C مثل سابقتها ، فإن الصيانة في حالة تطوير تطبيق Swift أسهل بكثير. شيء جعل Swift هو مستقبل تطوير تطبيقات iOS .

في حالة إنشاء تطبيق iOS باستخدام Objective-C ، كان من المفترض أن يحتفظ المطورون بملفي كود مميزين لزيادة وقت الإنشاء وكفاءة الكود. ومع ذلك ، أسقط Swift آلية الملفين هذه ، ودمج رأس Objective-C (.h) وملفات التنفيذ (.m) في ملف واحد (.swift). يكتشف مترجم LLVM تلقائيًا التبعيات أثناء قراءة ملف Swift ، وهو ما يمثل فائدة كبيرة لمطوري تطبيقات iOS.

بصرف النظر عن العوامل المذكورة أعلاه ، فإن الميزة الجديرة بالذكر لاختيار Swift على لغة برمجة Apple الأخرى هي توافقها مع Objective-C. قدمت Apple لمطوري التطبيقات إمكانية استخدام اللغتين في نفس المشروع. هذا ليس مفيدًا فقط في حالة تطوير تطبيق iOS باستخدام Swift من البداية ، ولكن أيضًا في ترقية تطبيقهم الحالي إلى Swift باستخدام كود Objective-C.

بينما أنت الآن على دراية بالاختلافات الفلسفية بين لغتي تطوير تطبيقات iOS ، دعنا ننتقل إلى الاختلافات أثناء التنفيذ العملي.

SWIFT VS OBJECTIVE-C: الاختلافات الرئيسية بين جبابرة تطوير IOS

من خلال تجربتي مع قاعدة بيانات Objective-C المعقدة وقاعدة كود Swift ، ستصادف العديد من الترقيات للمفاهيم الحالية جنبًا إلى جنب مع مقدمة للعديد من العناصر الجديدة التي تجعل عملية تطوير التطبيق سريعة. دون الحاجة إلى اللغط ، دعنا نلقي نظرة على كل شيء ستجده جديدًا / مختلفًا في حرب السرعة مقابل الهدف ج.

خيارات

عندما نتحدث عن أداء swift مقابل Objective-C ، يمكننا استدعاء طرق على كائنات صفرية للحصول على قيمة صفرية في Obj-C. يتعين علينا إجراء فحوصات صفرية يدويًا لفهم السلوك غير المحدد في حالة وجود قيمة صفرية غير متوقعة. ومع ذلك ، يمكن حل هذه المشكلة باستخدام اختياري ، وهو مفهوم جديد تم تقديمه في رمز Swift. اختياري يسمح بالوظائف التي قد لا تكون قادرة على إرجاع قيمة ذات مغزى لإرجاع قيمة مغلفة في اختياري أو لا شيء.

صيغة التصريح عن النوع الاختياري هي:

التعداد العام اختياري <ملفوف>: _Reflectable ، NilLiteralConvertible

من الناحية العملية ، يمكن أن يكون لها قيمة نوع ملفوف أو قيمة غير موجودة.

يجعل Swift السكر النحوي للإعلان عن الأنواع اختياريًا ، لذا يمكننا استبدال الاختيارية <سلسلة> بالسلسلة؟

توجد طريقتان أساسيتان للحصول على قيمة مغلفة من الحاوية الاختيارية:

تسلسل اختياري: يُستخدم في الحالة التي تتلقى فيها عبارة if-let الشرطية قيمة فقط في حالة وجودها.
التغليف الإجباري: يستخدم عندما يكون المتغير المعلن الاختياري غير معدوم. إذا كانت القيمة موجودة ، فستوفر المخرجات دون تنفيذ شروط. لكن في الحالة الأخرى ، سوف ينهار.
يمكننا أيضًا العثور على اختيارات غير مغلفة ضمنيًا بلغة Swift ، معلنة على أنها String!

فمثلا:

فئة XClass

{

var aString: String

var bString: String!

var cString: String؟

Init (سلسلة نصية: سلسلة)

{

aString = سلسلة

}

}

هنا،

لا يمكن أبدًا أن تكون السلسلة صفرية. من الأهمية بمكان أن يكون لهذا المتغير قيمة أثناء تهيئة الكائن ، وإلا فإن البرنامج سيؤدي إلى تعطل.
يمكن أن تكون السلسلة B صفرية. ومع ذلك ، إذا حاولت الوصول إلى كائن لا شيء ، فسوف يتعطل البرنامج.
يمكن أن تكون السلسلة C صفرية ويفترض أن تعامل كمتغير اختياري عادي.
ملحقات
يتم دمج الامتدادات والفئات الموجودة في Obj-C في كيان واحد ، امتدادات بلغة Swift. تضيف الإضافات وظائف جديدة إلى فئة أو تعداد أو هيكل أو بروتوكول موجود بالفعل ، وأفضل جزء هو أنك لا تحتاج إلى الوصول إلى كود المصدر الأصلي لتوسيع الأنواع.

مجموعات
إلى جانب الاختيارات ، هناك نوع بيانات جديد آخر تم تقديمه بلغة التطوير الجديدة من Apple وهو Tuples. تعتبر المجموعات (الموجودة في نوع البيانات المحدد من قِبل المستخدم) أساسًا لتجميع العديد من القيم في مجموعة مركبة واحدة. إنه العنصر الصحيح الذي يجب مراعاته إذا كنت تعتقد أن إنشاء نموذج في مكان ما قد يكون مبالغًا فيه والقاموس ليس مناسبًا للقارئ بشكل كافٍ. لمعرفة المزيد من Tuples ، راجع هذه المدونة .

علم الوراثة
تعد Generics واحدة من أكثر الميزات المدهشة في لغة برمجة Swift ، وفي الواقع ، يتم إنشاء الكثير من مكتبات Swift القياسية باستخدام رمز Swift. يتيح الكود العام للمطورين كتابة وظائف وأنواع مرنة وقابلة لإعادة الاستخدام يمكنها العمل مع مجموعة مختلفة من الأنواع ، مع مراعاة المتطلبات المحددة. هذا يقلل من مخاطر الازدواجية ويعزز قابلية قراءة الكود من خلال نهج واضح وملخص.

وفقًا لتجربتي ، يصعب الحصول على Generics في البداية ، تمامًا مثل العودية. ولكن ، عندما تحصل عليها ، ستكون قادرًا على الاسترخاء في عالم جديد تمامًا من إصلاح المشكلات المنطقية المرهقة.

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

تقدم Swift تعدادات جديدة متنوعة مع المزيد من الخيارات. يمكن أن تحتوي التعدادات السريعة على قيم مرتبطة ويمكن أن تحتوي حالة التعداد السريع على مجموعة محددة مسبقًا من الحقول. في الواقع ، يمكن أن تكون عمليات تعداد Swift متكررة ويمكنها تخزين القيم الأولية.

فمثلا:
رموز

نصوص
يمكن اعتبار النصوص المنخفضة وسيلة للوصول إلى المعلومات من تسلسل أو مجموعة أو قائمة في فئات وتعدادات وهياكل دون استخدام طريقة. يمكنك التفكير في الاشتراكات لتعيين القيم واستردادها بواسطة الفهرس دون إنشاء طرق منفصلة للتخزين والاسترداد. على سبيل المثال ، يمكنك الوصول إلى عناصر في مثيل Array مثل someArray [فهرس] وعناصر في مثيل قاموس مثل بعض القاموس [مفتاح].

بناء الجملة للإعلان عن نص منخفض كما يلي:

منخفض (فهرس: Int) -> كثافة العمليات {

احصل على {

// للإعلان عن قيمة الاشتراك

}

مجموعة (newValue) {

// لتحديد القيم

}

}

اكتب الاستدلال

اقترح Swift أيضًا أمان النوع لتطوير تطبيقات iOS ، وفقًا لمتغير عند الإعلان عن نوع معين ، سيكون نوعه ثابتًا وغير قابل للتغيير. سيحدد المترجم (أو يستنتج) نوع المتغير الخاص بك على أساس القيم التي تحددها.

فمثلا:

الكود 1
هنا ، سيُظهر المترجم خطأ عند محاولة التهيئة بقيم رقمية لمتغير str2 (انظر أدناه)

كود 03

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

صورة الكود

بصرف النظر عن هذا ، يتيح Swift أيضًا لمطوري التطبيقات تحديد القيم الافتراضية للمعلمات الوظيفية.

معالجة الأخطاء
تقدم Swift نهجًا جديدًا تمامًا لرمي الأخطاء القابلة للاسترداد والتقاطها وتداولها ومعالجتها في وقت التشغيل. للحصول على لمحة عن معالجة الأخطاء في Swift ، قم بالرجوع إلى المدونة.

بصرف النظر عن هذه ، فإن المفاهيم المختلفة التي تجعل تطوير تطبيق Swift مفيدًا للجميع على تطوير تطبيق Objective-C هي:

عارضات ازياء
في حالة Swift ، يُفضل أن تكون النماذج هياكل بدلاً من فئات.

البروتوكولات
في أول مقاطع فيديو WWDC من Apple ، تم تقديم Swift كـ "لغة موجهة نحو البروتوكول". يمكن تعريف البروتوكول على أنه مخطط للأساليب والخصائص والكيانات الأخرى التي تناسب مهمة / جزء من الوظائف. يمكن احتضانها بواسطة فئة أو تعداد أو هيكل لتسهيل التنفيذ الفعلي لتلك المتطلبات ، وهي أقوى بكثير مقارنةً بـ Obj C مع ميزات توفير تطبيقات افتراضية ، ودمج الأدوية الجنيسة ، إلخ.

بصفتي مطور تطبيقات iOS ، فأنا أفضل إنشاء بروتوكول قبل تعريف الفصل باعتباره الممارسة الأكثر فاعلية للاستفادة من مزايا لغة برمجة Apple المتقدمة.

نهج البرمجة الوظيفية
تمكّن Swift المطورين من استخدام المزيد من الأساليب الوظيفية لحل المشكلات العادية بدلاً من استخدام أنواع الحلقات أو المراجع التقليدية. هنا ، المنظور هو تحليل المشكلة من حيث ماهية الحل ، بدلاً من تحديد كيفية الحصول على الحل كما هو الحال في النهج التقليدي.

من تجربتي مع كل من لغة iOS ، هناك شيء واحد لاحظته وهو أن ما كنا نفعله من خلال التكرارات باستخدام حلقات for في Objective-C يمكن القيام به باستخدام مفهوم التصفية والخريطة والتقليل في Swift. للحصول على معلومات متعمقة حول هذه الوظائف عالية الترتيب في البرمجة الوظيفية ، راجع المدونة.

خطوة بخطوة دليل لتحويل تطبيق OBJECTIVE-C الكامل إلى SWIFT

اليوم ، هناك العديد من الأدوات لتحويل تطبيق من Objective-C إلى Swift سطرًا بسطر. ومع ذلك ، أنصح بعدم استخدام أي منها. على الرغم من أن كلتا لغتي iOS قابلة للتشغيل البيني ، إلا أن نماذج البرامج الخاصة بهما مختلفة. سيؤدي ترحيل تطبيق من Obj-C إلى Swift مباشرةً إلى زيادة مخاطر استخدام النماذج الخاطئة. اسمحوا لي أن أتوسع في هذا.

تتأثر Swift ، على عكس سابقتها ، بنموذج البرمجة الوظيفية ، مما يجعلها تعتمد بشكل كبير على الثبات. على سبيل المثال ، إذا تحدثت عن المصفوفات والقواميس - تُستخدم هذه النماذج الأساسية لتكون نوعًا مرجعيًا في Objective-C ، لكنها من نوع القيمة في Swift ، وبالتالي فهي غير قابلة للتغيير. هذا يعني أن تحويل كود Obj-C إلى Swift دون وعي باستخدام أي أداة سيجعلك تواجه الكثير من الأخطاء التي يصعب تصحيحها. إلى جانب ذلك ، يحتوي Swift على الكثير من الميزات الجديدة (كما هو موضح أعلاه) والتي تجعل الخوارزميات / الأساليب أكثر كفاءة والبرامج بسرعة! في الواقع ، هذا هو السبب الرئيسي وراء كشف Apple النقاب عن لغة جديدة بدلاً من ترقية Obj-C. مع وضع كل هذه النقاط في الاعتبار ، أوصي بشدة أن يكتب الجميع تطبيقًا جديدًا في Swift من البداية بدلاً من الانتقال إلى التحويل سطرًا بسطر من Obj-C إلى Swift.

ومع ذلك ، إذا كنت ترغب في تحويل تطبيق Objective-C كامل إلى Swift ، فإن إحدى الأدوات التي يمكنك استخدامها هي Swiftify. تسهل الأداة عملية ترقية كود Obj-C إلى لغة برمجة Apple الجديدة بنقرة واحدة ؛ توفير آلاف ساعات العمل. تتيح ميزة التشغيل البيني إعادة دمج كود iOS المحول إلى Objective-C دون أي متاعب ، مما يعني أنه يمكنك استكشاف عدد لا يحصى من الخيارات التي يقدمها Swift ثم دمجها مرة أخرى في مشروع Obj-C الخاص بك دون إعادة كتابة كل شيء مرة واحدة.

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

1. تغيير الهوية إلى instancetype حيثما أمكن ذلك
2. توظيف وحدات ماكرو التعداد الصحيحة
3. الترقية إلى صيغةproperty الأحدث

بينما يساعد المحول في آليات تحليل وتطبيق التعديلات المحتملة ، فإنه لا يصور دلالات الكود. لذلك ، يُنصح جميع مطوري تطبيقات iOS بمراجعة كل شيء يدويًا مرة واحدة ثم تأكيد التغييرات.

لاستخدام المحول ، حدد Edit -> Refactor -> Change to Modern Objective-C syntax.

عملية ترحيل كود Objective-C إلى Swift
الطريقة الأكثر فاعلية لتحويل تطبيق Objective-C كامل إلى Swift هي ، في البداية ، فئة واحدة في كل مرة ، خاصةً فئة بدون أي فئة فرعية نظرًا لأنه لا يمكنك تصنيف فئات Swift الفرعية في Obj-C.

استبدل ملفات .m و. h ذات الصلة بالفئة بملف swift واحد. باستخدام هذا ، سيتم إدخال كل شيء من الواجهة إلى التنفيذ تلقائيًا في ملف Swift. بالإضافة إلى ذلك ، لا تحتاج إلى إنشاء ملف رأس لأن Xcode يقوم تلقائيًا بإنشاء رأس ، إذا لزم الأمر.

تصميم ملف رأس التجسير
عند إضافة ملف .swift الأول الخاص بك ، ستجد موجهًا مثل ذلك الموضح أدناه.

كود سريع 12

انقر فوق خيار " إنشاء رأس التجسير ".

دليل خطوة بخطوة

1. اختر زوجًا من ملفات .h و .m التي تريد تحويلها إلى Swift. إذا كنت تريد تحويل المشروع بأكمله ، فاترك فئة AppDelegate لوقت لاحق.
2. ابحث عن #import “MyViewController.h” في جميع أنحاء التعليمات البرمجية وقم بإزالتها من Objective-C Bridging Header File ([MyProject] -Bridging-Header.h).
3. استبدل مثيلات #import “[filename] .h” بـ #import “[MyProject] -Swift.h” في جميع ملفات .m ووضعclass [filename] بدلاً من #import “[filename] .h” في كل ملفات. h.
4. تحويل جزء من ملفات Obj-C إلى Swift. يمكن القيام بذلك بسهولة باستخدام امتداد Finder الخاص بـ "Swiftify for Xcode". بخلاف ذلك ، انسخ محتوى ملفات .m و. h إلى .swift واستخدم الخيار "تحويل الملف إلى Swift" المتاح في Swiftify Xcode Extension.
5. استبدل ملفات .h و. m بالملفات المحولة. swift في المشروع.
6. تجميع المشروع وإصلاح أخطاء التحويل. بينما ستتم إدارة العديد من المشكلات بسهولة باستخدام اقتراحات الإصلاح التلقائي لـ Xcode ، يمكنك أيضًا الاعتماد على Swiftify للإبلاغ عن الأخطاء التي تظهر عدة مرات في المشروع وإصلاحها.
7. بمجرد الانتهاء ، قم ببناء وتشغيل المشروع. إذا ظهرت مشكلة "Class not Found" متبوعة بالتعطل ، فابحث عن جميع الإشارات إليها في Storyboard Editor. أعد إدخال اسم الفصل في Identity Inspector ، واحفظه وحاول مرة أخرى.
8. إذا كنت تقوم بتحويل المشروع بأكمله ، يمكنك تحويل فئة AppDelegate الآن. في هذه المرحلة ، تم تحويل جميع الملفات الأخرى إلى Swift وهكذا ، إذا لم تكن هناك ملفات Obj-C متبقية في الهدف ، يمكنك بسهولة حذف ملف main.m و .pch (رأس مترجم مسبقًا).

ما هي الممارسة التي تفضلها - إنشاء تطبيق iOS جديد في Swift من البداية أو تحويل Objective-C إلى Swift بالكامل؟ شارك بآرائك عبر قسم التعليقات أدناه.