Swift 101 - العمل مع القيم الاختيارية الجديدة لـ Swift

تحتوي لغة برمجة Swift على ميزة جديدة تسمى الاختيارية التي لم تكن متوفرة سابقًا في Objective-C. تشبه الأنواع الاختيارية في Java وأنواع nullable في لغة البرمجة C #.

لماذا استخدام الاختيارية؟

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

تتيح لك القيم الاختيارية في Swift أن تكون أكثر دقة في التعليمات البرمجية الخاصة بك عن طريق السماح لك بتحديد الوقت الذي تكون فيه على ما يرام لتكون قيمة معينة فارغة (وعندما لا تكون كذلك!) هذا يساعدك على تجنب أخطاء البرمجة الشائعة التي تحدث في تطبيقك عندما يواجه قيمة غير متوقعة.

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

الشكل 1 - يمكنك تحديد أن سمة كيان البيانات الأساسية اختيارية.

يتيح لك الآن Swift أن تفعل الشيء نفسه مع خصائصك ومتغيراتك. فيما يلي إعلان اختياري مكافئ في Swift:

var middleName: String?

يقوم هذا الإعلان بإنشاء متغير باسم middleName من النوع String . تشير علامة الاستفهام ( ؟ ) بعد نوع متغير String إلى أن متغير middleName يمكن أن يحتوي على قيمة يمكن أن تكون سلسلة أو لا شيء . أي شخص ينظر إلى هذا الرمز يعرف على الفور أن middleName يمكن أن يكون لا شيء . انها وثائق ذاتية!

إذا لم تحدد قيمة أولية لثابت أو متغير اختياري (كما هو موضح أعلاه) ، فسيتم تعيين القيمة تلقائيًا إلى لا شيء بالنسبة لك. إذا كنت تفضل ذلك ، يمكنك تعيين القيمة الأولية بشكل صريح إلى صفر:

var middleName: String? = nil

الآن دعونا نلقي نظرة فاحصة على كيفية استخدام لا شيء في سويفت.

لا شيء في سويفت

قد لا يكون ذلك واضحًا للوهلة الأولى ، ولكن لا يمكن أن يكون سوى الخيارات الاختيارية . كما هو مذكور في كتاب لغة برمجة Swift من Apple (متاح مجانًا في iBooks Store):

لا يمكن استخدام nil مع الثوابت والمتغيرات غير الاختيارية. إذا احتاج ثابت أو متغير في الشفرة إلى عدم وجود قيمة في ظل ظروف معينة ، فقم دائمًا بإعلانها كقيمة اختيارية من النوع المناسب.

هذا يعني أنه لا يمكنك القيام بشيء كهذا ، لأن متغير الاسم الأول لم يتم وضع علامة عليه باستخدام علامة استفهام للإشارة إلى أنه اختياري:

var firstName: String = nil

ينتج هذا الرمز خطأ وقت الترجمة التالي:

لا يتوافق النوع "String" مع البروتوكول "NilLiteralConvertible" .

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

الوصول إلى القيم الاختيارية

على عكس لغات البرمجة الأخرى ، في Swift ، لا يمكنك الوصول إلى قيمة اختيارية مباشرة . يجب عليك لف الأول الاختياري للوصول إلى قيمته الأساسية. خذ على سبيل المثال الكود التالي:

var firstName: String = "Ryan"

فار middleName: سلسلة؟ = "مايكل"

var firstAndMiddleNames: String

firstAndMiddleNames = firstName + "" + middleName

تعريف الأسطر الثلاثة الأولى من التعليمات البرمجية متغير سلسلة الاسم الأول ومتغير سلسلة الاسم الأوسط الاختياري ومتغير سلسلة السلسلة الأولى. يلخص السطر التالي من التعليمات البرمجية (الصلات) قيم المتغير firstName و middleName مع وجود مسافة بينهما. قد تفاجأ عندما تجد أن سطر التعليمات البرمجية هذا ينشئ خطأ وقت الترجمة التالي:

قيمة نوع الخيار "سلسلة؟" غير ملفوف هل تقصد استخدام '!' أو "؟"؟

هذه هي واحدة من آليات الحماية في سويفت. يجبرك على الإقرار بأن القيمة قد تكون لا شيء على الإطلاق . لذلك ، كيف يمكنك لف اختياري؟ هناك طريقتان رئيسيتان كما هو موضح في الأقسام التالية.

باستخدام Unsrapping القسري لـ الاختياري

وفقًا لما اقترحه خطأ المحول البرمجي في القسم السابق ، تتمثل إحدى طرق فك القيمة الاختيارية في استخدام علامة التعجب (!) بعد اختياري لفكها بشكل صريح. فمثلا:

firstAndMiddleNames = firstName + " " + middleName!

يفرض هذا يدويًا قيمة الاسم الأوسط الاختياري لتكون غير ملفوفة. ومع ذلك ، إذا كان middleName يحتوي على لا شيء في وقت التشغيل ، فسيؤدي ذلك إلى حدوث خطأ وقت تشغيل EXC_BAD_INSTRUCTION . لذلك ، من الواضح أنك لا ترغب في استخدام إلغاء التغليف القسري إلا إذا كنت متأكدًا تمامًا من أن القيمة ليست خالية .

باستخدام الربط الاختياري لفك الاختيارات

يمكنك استخدام تقنية تعرف باسم الربط الاختياري لاختبار ما إذا كان اختياري يحتوي على قيمة ، وإذا كان الأمر كذلك ، قم بتخزين هذه القيمة في متغير مؤقت أو ثابت. لإظهار كيف يعمل هذا مع المثال السابق ، تحقق من هذا الرمز:

var firstName: String = "Ryan"

فار middleName: سلسلة؟ = "مايكل"

var firstAndMiddleNames: String

إذا ترك الأوسط = middleName

{

firstAndMiddleNames = firstName + "" + middle

}

آخر

{

firstAndMiddleNames = الاسم الأول

}

عند تحديد الشرط if في وقت التشغيل ، وإذا كان المتغير middleName يحتوي على قيمة سلسلة ، فإن الشرط يتم تقييمه إلى true ، وتكون القيمة الموجودة في متغير middleName غير ملفوفة ، ويتم تخزينها في الثابت الأوسط والرمز داخل أقواس متعرجة من عبارة if يتم تنفيذ.

إذا كان المتغير middleName يحتوي على لا شيء ، يتم تقييم الشرط إلى false ، ولن يتم فك القيمة الاختيارية ، ويتم تنفيذ التعليمات البرمجية الموجودة في الأقواس المتعرجة للبيان الآخر .

ضمنيًا اختيارية Unwrapped

يحتوي سويفت أيضًا على شيء يُطلق عليه اختيارات غير ملفوفة ضمنيًا. هذه اختيارات لا تحتاج إلى فكها باستخدام إما الإلغاء القسري (!) أو الربط الاختياري لأنها غير ملفوفة ضمنيًا (تلقائيًا). يتم إعلانها باستخدام علامة تعجب (!) بدلاً من علامة استفهام (؟).

تشاهد غالبًا اختيارات غير ملفوفة ضمنيًا عند العمل مع منافذ Interface Builder (خصائص IBOutlet ). فمثلا:

@IBOutlet weak var lblDescription: UILabel!

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

في هذا المثال ، لا تضمن خاصية المنفذ أن تحتوي على إشارة إلى تسمية ولكن يجب أن تكون كذلك . إذا كان لا يحتوي على إشارة إلى تسمية ، فهذا يعني أن العلاقة بين المخرج والتسمية قد تم قطعها. في هذه الحالة ، لا بأس في وجود خطأ في وقت التشغيل لأنك تريد أن تعرف أن الاتصال مقطوع بحيث يمكنك إصلاحه!

من الواضح ، في الحالات التي لست متأكدًا فيها بنسبة 100 في المائة أن ثابت أو متغير يحتوي على قيمة ، يجب عليك استخدام خيار اختياري عادي بدلاً من ذلك.

استنتاج

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