الشروط في Swift: if و switch و guard
تطبيقات iPhone تتخذ قرارات في كل لحظة: هل كلمة المرور صحيحة؟ هل البطارية منخفضة؟ هل الوضع الليلي مفعّل؟ في هذا الدرس ستتعلم أدوات القرار في Swift، ومعها أداتان تتميز بهما: switch القوي الذي يحميك من نسيان الحالات، و guard التي تجعل الكود أنظف.
if و else
Section titled “if و else”let score = 72
if score >= 90 { print("ممتاز")} else if score >= 50 { print("ناجح")} else { print("راسب")}ناجحلاحظ: في Swift لا تحتاج أقواساً حول الشرط، لكن الأقواس المعقوفة { } إجبارية حتى لو كان الجسم سطراً واحداً. هذا القرار في تصميم اللغة يمنع أخطاء شهيرة في لغات أخرى.
والشرط يجب أن يكون Bool حرفياً: if score خطأ ترجمة في Swift، على عكس C.
العوامل المنطقية: && (و)، و || (أو)، و ! (ليس):
let age = 16let hasTicket = trueif age >= 13 && hasTicket { print("تفضل بالدخول")}تفضل بالدخولالمعامل الثلاثي
Section titled “المعامل الثلاثي”let stock = 0let status = stock > 0 ? "متوفر" : "غير متوفر"print(status)غير متوفرswitch: أقوى مما تتوقع
Section titled “switch: أقوى مما تتوقع”let day = "الجمعة"
switch day {case "الجمعة", "السبت": print("عطلة نهاية الأسبوع")case "الأحد": print("أول أيام الدراسة")default: print("يوم دراسي عادي")}عطلة نهاية الأسبوعثلاثة أشياء تميز switch في Swift:
- لا انزلاق: بعد تنفيذ الحالة المطابقة، يخرج
switchتلقائياً، فلا تحتاجbreakكما في C و Java. - إجبارية الشمول: يجب أن تغطي كل الاحتمالات. مع النصوص والأرقام يعني ذلك وجود
default. إذا نسيتها، يرفض المترجم الكود:switch must be exhaustive. - عدة قيم في حالة واحدة بفاصلة:
case "الجمعة", "السبت":.
مع المجالات:
let grade = 85
switch grade {case 90...100: print("A")case 75..<90: print("B")default: print("C")}B90...100: من 90 إلى 100 شاملة.75..<90: من 75 إلى 89، أي بدون 90.
تخيّل switch مثل آلة بيع المشروبات: كل زر يعطيك مشروباً واحداً فقط (لا انزلاق)، والآلة مصممة بحيث يكون لكل زر نتيجة، فلا يوجد زر يضيع نقودك (الشمول).
guard: الخروج المبكر
Section titled “guard: الخروج المبكر”guard شرط يقول: «تأكد من هذا، وإلا اخرج فوراً»:
func checkAge(_ text: String) { guard let age = Int(text) else { print("اكتب رقماً صحيحاً") return } guard age >= 13 else { print("التطبيق لمن عمرهم 13 فأكثر") return } print("أهلاً بك، عمرك \(age)")}
checkAge("abc")checkAge("10")checkAge("15")اكتب رقماً صحيحاًالتطبيق لمن عمرهم 13 فأكثرأهلاً بك، عمرك 15- جسم
elseفيguardيجب أن يخرج من الدالة، بـreturnغالباً. - الميزة الكبرى:
guard let age = ...تفتح الاختياري، ويبقىageمتاحاً في باقي الدالة بعدها، وليس داخل قوسين فقط كما فيif let.
تخيّل guard مثل حارس عند مدخل المبنى: يفحص الشروط واحداً واحداً عند الباب، ومن لا يستوفيها يُرد فوراً. ومن يدخل، يتحرك بحرية في المبنى كله. هذا يجعل الكود مستقيماً ومقروءاً، بدلاً من شروط if متداخلة داخل بعضها.
(ستتعلم الدوال بالتفصيل في الدرس الخامس، والمهم هنا فكرة guard.)
جرّب بنفسك
Section titled “جرّب بنفسك”- اكتب
switchعلى متغيرmonth(رقم من 1 إلى 12) يطبع الفصل: الشتاء والربيع والصيف والخريف، مستخدماً عدة قيم في كل حالة. - اكتب
switchعلى درجة الحرارة بالمجالات: أقل من 15 «بارد»، ومن 15 إلى 28 «معتدل»، وأكثر «حار». - اكتب دالة
login(username: String, password: String)تستخدمguardلترفض اسم المستخدم الفارغ (تلميح:username.isEmpty)، وكلمة المرور الأقصر من 6 حروف، ثم تطبع «تم الدخول».
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان default في switch: خطأ
switch must be exhaustive. - محاولة كتابة if بلا أقواس معقوفة: خطأ ترجمة، حتى لسطر واحد.
- guard بدون خروج: جسم
elseفيguardيجب أن ينتهي بـreturnأو ما يخرج من النطاق.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ماذا يحدث في switch بلغة Swift بعد تنفيذ الحالة المطابقة؟
Swift لا تسمح بالانزلاق الضمني، فتخرج تلقائياً بعد الحالة المطابقة.
سؤال
ما الميزة الأساسية لـ guard let مقارنة بـ if let؟
guard يخرج مبكراً عند الفشل، وبعده تبقى القيمة متاحة في كل ما يليه من الدالة.
الخلاصة
Section titled “الخلاصة”ifبلا أقواس حول الشرط، لكن الأقواس المعقوفة إجبارية، والشرطBoolفقط.- المعامل الثلاثي لاختيار قيمة في سطر واحد.
switchبلا انزلاق، ويجب أن يغطي كل الاحتمالات، ويقبل عدة قيم ومجالات....مجال شامل، و..<مجال بدون الطرف الأخير.guardللخروج المبكر، وتبقى قيمها المفتوحة متاحة في باقي الدالة.