الoptional في swift3
البرنامج المستخدم : xcode8
اللغة المستخدمة : swift3
السلام عليكم..
في هذا الدرس سنتكلم عن الoptional في لغة سويفت. ماهي؟ و كيف و تستخدم ؟ و لماذا ؟
و للتطبيق على هذا الدرس لن تحتاج سوى للplayground و لن تحتاج لإنشاء مشروع جديد..
لذلك قم بفتح برنامج الإكس كود و قم باختيار : get started with a playground
ما هو الoptional ؟
لنتعرف أكثر على ماهية الoptional قم بإضافة السطر التالي إلى الplayground :
var x : Int = 5
لقد قمت بتعريف متغير باسم x و من نوع Int و قمت بإسناد القيمة 5 إليه..
لكن هل أنت بحاجة لإسناد قيمة للمتغير بمجرد إنشائه ؟ ماذا إن كنت لاتريد وضع قيمة ابتدائية للمتغير ؟ ماذا إن كنت غير متأكد من أن المتغير x يجب أن يحوي قيمة أصلا؟؟
مثلا: تخيل أنك تقوم بعمل موقع و حتى يقوم المستخدم بالتسجيل فيه عليه أن يضيف بياناته، هناك بعض البيانات المهمة التي يجب أن يضعها المستخدم كالاسم و الإيميل.. الخ لكن لنفرض أن أحد هذه البيانات هو رقم الجوال، عادة و في أغلب المواقع رقم الجوال ليس إجباريا و يمكن للمستخدم أن يضعه باختياره، و بالتالي أن كانت القيمة x تمثل رقم الجوال فليس من الضروري أن تحوي قيمة فبعض المستخدمين سيقومون بإضافتها و الآخرون لا..
و هنا تكمن أهمية الoptional حيث تتيح فرصة للمتغير أن يحوي قيمة معينة أو أن يكون بلا قيمة ( تكون له قيمة nil )
الآن عد إلى الكود الذي كتبته و جرب أن تمسح القيمة التي أسندتها للمتغير ليبدو بهذا الشكل :
var x : Int
ثم قم بكتابة x السطر الذي يليه لتعرض قيمتها على الشريط الجانبي
ستجد أن البرنامج يعرض لك خطأ نصه : variable 'x' used before being initialized
و هذا يعني أن المتغير x يتم استخدامه قبل أن يتم إنشاء قيمة خاصة فيه حيث أن من شروط لغة سويفت في أي متغير هو أن يحوي قيمة قبل أن يتم استخدامه أصلا لذا لابد من وجود قيمة تعني عدم وجود قيمة للمتغير كحل لهذه الحالة
و يمكن استبدال هذا القيمة مستقبلا بقيمة من نوع المتغير ( Int في هذه الحالة )
لعل الأمور تبدو معقدة بعض الشيء لكن ستتضح مع إكمال الدرس..
أحد القيم التي يمكن إسنادها للمتغيرات بأنواعها المختلفة هي قيمة nil و التي تعني ( لا شيء ) و هي التي تقابلها null في لغات أخرى كالجافا مثلا
و هذه القيمة تكمن أهميتها في:
-أنها تعطي قيمة ابتدائية للمتغير و بالتالي يمكن استخدام المتغير دون أخطاء.
-أن هذه القيمة هي ليست Int و لا String و لا Double... الخ بل هي قيمة مميزة تعطينا إشارة أن المتغير الذي يحملها لا يحوي قيمة.
- أن هذه القيمة يمكن استبدالها مستقبلا بقيمة أخرى حسب نوع المتغير.
الآن قم بتحويل تعريف المتغير x ليبدو كالتالي :
var x : Int = nil
لاحظ أن البرنامج سيظهر لك خطأ مرة أخرى لكن لمَ هذا الخطأ ؟ ألم نذكر أن هذه القيمة يمكن أن يحويها متغير من أي نوع ؟ إذا مالمشكلة ؟
صحيح أن أي متغير من أي نوع يمكن أن يحوي هذه القيمة، و لكن لن تكون له إمكانية الحصول على هذه القيمة إلا عندما تعطيه هذه الإمكانية عند تعريف هذا المتغير بإضافة (؟) بجانب نوعه عند تعريفه ليبدو كالتالي..
var x : Int? = nil
و الآن يمكنك أن تطلق على المتغير x اسم optional و هي تعني اختياري أي بمعنى آخر : لك الخيار في تحديد ما إذا كان الx يساوي قيمة حقيقية من نوع Int أو لا يحوي قيمة أصلا( يساوي nil ) و هذا بفضل علامة الاستفهام التي قمنا بإضافتها بجانب المتغير.
و الآن نوع المتغير x لم يعد Int و إنما أصبح Int? أو optional Int و يمكنك التأكد من النوع عن طريق الضغط على alt و اسم المتغير وسيظهر لك نوعه
و الآن: قم بتغيير x إلى قيمة 5 مثلا في السطر الذي يليه ثم إلى قيمة nil في السطر الذي يليه ثم إلى قيمة 10 مثلا و لاحظ أن ذلك يتم دون مشاكل و دون أخطاء
x = 5
x = nil
x = 10
x = nil
و الآن قم بجعل x = أحد قيم الint و لتكن ١٠ على سبيل المثال ثم قم بطباعة قيمة المتغير x
x = 10
print(x)
لاحظ أن البرنامج لم يقم بطباعة قيمة x و إنما قام بطباعتها بداخل كلمة Optional بالشكل التالي :
Optional(10)
صحيح أن x هي الآن تساوي القيمة ١٠ لكنها ما زالت قيمة من optinal Int و ما زال طابع الoptional يغطي هذا المتغير
و حتى تقوم بتخليصها من غطاء الoptional الذي يحويها يمكنك أن تستخدم ما يعرف ب : force unwrapping
و هو تخليص المتغير من غطاء الoptional في مرحلة معينة أو في سطر محدد من البرنامج و ذلك عن طريق استخدام علامة التعجب بجانب اسم المتغير، قم بالرجوع إلى أمر الطباعة و قم بكتابته بإضافة علامة التعجب للمتغير كالتالي :
print(x!)
الآن بخلاف المرة السابقة سيقوم البرنامج بطباعة 10.
لماذا؟ لأنك قمت برفع غطاء الoptional من x و هو ما يعرف بال(unwrapping) فأصبحت تحوي قيمة (Int) بدلا من (Int?) أو (optional Int) فأصبحت كمتغير Int عادي في هذا السطر من الكود.
إن رفع الغطاء الذي قمت بعمله لن يطبق على x إلا في ذلك السطر و أما في باقي السطور فأن x ستبقى optional Int. جرب أن تطبع x في السطر التالي لتتأكد من ذلك
و الآن لنفرض أنك ستقوم باستخدام x عدة مرات خلال برنامجك و في كل هذه المرات لا تريد أن تعامل x معاملة الoptional بل تريد أن تقوم بعمل unwrapping لها في كل مرة دون أي استثناء فمالحل ؟
قبل الإجابة قد تتساءل: مالفائدة من جعل x لتكون optional عند تعريفها إذا كنا سنرفع عنها غطاء الoptional في كل مرة نستخدمها فيه في الكود ؟
و الإجابة على ذلك: قد تحتاج في بعض الحالات إلى البدء بقيمة nil للx في البداية فقط و لكن بعد ذلك ستكون متأكدا أن الx لن تساوي nil أبدا بعد هذه المرحلة و لذلك ستحتاج لعمل unwrapping في كل مرة.
أو لتفادي عمل unwrapping و كتابة ! في كل مرة يمكنك استخدام علامة التعجب عند تعريف المتغير كالتالي :
var x : Int! = nil
و هي تعني : أن المتغير x سيكون optional و سيساوي nil في البداية و لكن متى ما تم استخدامه فسيرفع عنه غطاء الoptional و سيعامل كمتغير Int يحوي قيمة دون الحاجة لكتابة علامة التعجب.
و للتأكد من ذلك قم بإسناد قيمة لx و من ثم قيم بطباعة القيمة
x = 4
print(x)
و ستجد أن البرنامج يقوم بطباعة 4 دون ظهور كلمة optional
في الحقيقة..
إن استخدام رفع الغطاء عن متغيرات الoptional بهذه الطريقة يعتبر طريقة سيئة و خطيرة في كتابة الكود و سنوضح خطر كتابة الكود بهذه الطريقة و الحل المستخدم لتفادي ذلك في الدرس القادم باذن الله
إلى ذلك الحين استودعكم الله
التعليقات (2)
ما شاء الله شرح واضح وسهل الفهم.
مأجور إن شاء الله , وأرجو أن تكمل هذا الدرس ..
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !