استخدام Guard Let
جزء من قسم الأساسيات في رحلة Swift على Coddy — الدرس 13 من 86.
بينما يقوم if let بفك تغليف القيمة الاختيارية (optional) وتشغيل الكود عند وجود قيمة، يتخذ guard let نهجاً معاكساً — فهو يخرج مبكراً عند فقدان القيمة. هذا مفيد بشكل خاص داخل الدوال حيث تريد معالجة الحالة "السيئة" أولاً والحفاظ على نظافة المنطق البرمجي الأساسي.
func greet(name: String?) {
guard let unwrappedName = name else {
print("No name provided")
return
}
print("Hello, \(unwrappedName)!")
}
greet(name: "Taylor") // مرحباً، Taylor!
greet(name: nil) // لم يتم توفير اسمتتحقق جملة guard let مما إذا كان name يحتوي على قيمة. إذا لم يكن كذلك، يتم تشغيل كتلة else وتخرج الدالة باستخدام return. إذا كان الاختياري (optional) يحتوي على قيمة، فسيتم فكه في unwrappedName — وهنا يكمن الفرق الرئيسي عن if let: يظل المتغير الذي تم فكه متاحاً لبقية الدالة، وليس فقط داخل كتلة برمجية.
يحافظ نمط "الخروج المبكر" (early exit) هذا على قابلية قراءة الكود الخاص بك من خلال معالجة حالات الخطأ مسبقًا، بحيث لا يكون المنطق الرئيسي متداخلاً داخل جمل if متعددة.
التحدي
سهلاكتب دالة باسم validateAge تأخذ معامل age اختيارياً وتستخدم guard let لفك تغليفه بأمان.
إذا كان العمر nil، فقم بإرجاع "Invalid age". بخلاف ذلك، قم بإرجاع "Age: [value]" حيث [value] هو العمر بعد فك التغليف.
المعاملات:
age(Int?): عدد صحيح اختياري يمثل عمر الشخص
القيمة المرجعة: سلسلة نصية — إما "Invalid age" إذا كان المدخل nil، أو "Age: [value]" مع القيمة المفكوكة.
مثال: إذا كان age هو 25، فقم بإرجاع "Age: 25". إذا كان age هو nil، فقم بإرجاع "Invalid age".
ورقة مرجعية
استخدم guard let لفك تغليف (unwrap) قيمة اختيارية (optional) والخروج مبكراً عند فقدان القيمة:
func greet(name: String?) {
guard let unwrappedName = name else {
print("No name provided")
return
}
print("Hello, \(unwrappedName)!")
}تتحقق جملة guard let مما إذا كانت القيمة الاختيارية (optional) تحتوي على قيمة. إذا لم تكن كذلك، يتم تنفيذ كتلة else وتخرج من الدالة باستخدام return. إذا كانت القيمة الاختيارية تحتوي على قيمة، يتم فك تغليفها وتظل متاحة لبقية نطاق (scope) الدالة.
يعالج نمط "الخروج المبكر" (early exit) هذا حالات الخطأ مسبقاً، مما يحافظ على نظافة المنطق البرمجي الأساسي وبدون إزاحة (unindented).
جرّب بنفسك
func validateAge(age: Int) -> String {
// اكتب الكود هنا
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمةالإسناد المركبمراجعة - عمليات رياضية بسيطةمعاملات المقارنة7أساسيات الإدخال والإخراج
دالة الطباعةتضمين النصوصإدخال ReadLineتحويل الأنواعمراجعة - حتى 120مراجعة - True أو False10الدوال
تعريف دالةالمعاملات والوسائطقيم الإرجاعتسميات الوسائطمراجعة - دالة Sigmaمراجعة - دالة Validationالقيم الافتراضية2المتغيرات
Let مقابل Varتوصيف الأنواع (Type Annotations)الأرقامStringBooleanقواعد التسميةمراجعة - تهيئة المتغيرات5المعاملات - الجزء الثاني
المعاملات المنطقية - الجزء الأولالمعاملات المنطقية - الجزء الثانيمراجعة - المنطق البسيطالمعاملات المنطقية - الجزء الثالثالمعامل الثلاثي (Ternary Operator)8حاسبة تقسيم الفاتورة
رسالة الترحيبالحصول على المدخلات3القيم الاختيارية (Optionals)
ما هي القيم الاختياريةفك القيم باستخدام If Letاستخدام Guard Letمعامل دمج Nilمراجعة - فك القيم بأمان9حلقات التكرار
حلقة For-Inحلقة Whileحلقة Repeat-WhileBreakContinueمراجعة - المضروب (Factorial)النطاقات في حلقات التكرارالحلقات المتداخلةمراجعة - الإدخال الديناميكي (Dynamic Input)