try? و try!
جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 46 من 56.
أحياناً لا يهمك أي خطأ قامت الدالة برميه، فكل ما تريده هو الحصول على نتيجة أو قيمة بديلة. توفر لك لغة Swift صيغتين مختصرتين.
try? يحول أي خطأ يتم إلقاؤه إلى nil. النتيجة هي Optional من نوع الإرجاع الخاص بالدالة:
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0قم بإقرانه مع ?? للحصول على قيمة افتراضية مضمنة. هذا هو أقصر إصدار لـ "استدعِ هذا الشيء، وأعطني قيمة في كلتا الحالتين".
تخبرنا try! بـ "أعلم أن هذا لن يلقي خطأً". إذا حدث ذلك، فسيتوقف برنامجك عن العمل. استخدمها فقط عندما يمكنك إثبات أن الاستدعاء آمن؛ وفي الكود اليومي، يفضل استخدام try? مع قيمة بديلة أو استخدام do/catch الكاملة.
التحدي
سهلقم بتعريف NumError: Error مع حالة واحدة bad. قم بتعريف دالة parseEven(_ s: String) throws -> Int التي تقوم بما يلي:
- ترمي الخطأ
.badعندما لا يمكن تحليلsكـInt، أو عندما تكون القيمة المحللة فردية - بخلاف ذلك، تعيد العدد الصحيح الذي تم تحليله
اقرأ سطراً واحداً من المدخلات: قائمة من النصوص مفصولة بفاصلة ,. لكل نص، استخدم try? متبوعة بـ ?? -1 للحصول إما على العدد الصحيح الزوجي المحلل أو -1.
اطبع، بالترتيب، الأعداد الصحيحة الناتجة مفصولة بـ ,. ثم في سطر ثانٍ، اطبع عدد القيم التي كانت نتيجتها -1.
للمدخلات 4,7,abc,8,11,2، يكون المخرج هو:
4,-1,-1,8,-1,2
3ورقة مرجعية
try? يحول الخطأ الملقى إلى nil، ويعيد Optional:
let result = try? risky() // nil عند حدوث خطأ
let safe = (try? risky()) ?? 0 // قيمة بديلةtry! يتسبب في توقف البرنامج (crash) إذا ألقى الاستدعاء خطأً — استخدمه فقط عندما يكون الاستدعاء مضمون الأمان:
let value = try! guaranteedSafe()جرّب بنفسك
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// لكل part، (try? parseEven(part)) ?? -1
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتدفق
1النصوص بعمق
العد والفهارسحالة الأحرف وإزالة الفراغاتالبحث في النصوصتقسيم ودمج النصوصاستبدال النصوص الفرعيةمراجعة - التحقق من اسم المستخدم4المجموعات
إنشاء المجموعاتالاتحاد والتقاطعالطرح والفرق المتماثلالمجموعات الجزئية والشاملةمراجعة - تصفية الـ Tag7مشروع - متتبع العادات
نظرة عامة على المشروعتحديد كمكتمل2النطاقات والخطوات
المغلقة مقابل نصف المفتوحةالخطوة (Stride)دوال النطاقاتالنطاقات في Switchملخص - شبكة التقويم5الدوال من الرتبة العليا - الجزء الأول
MapFilterReduceربط Map و Filter و Reduceمراجعة - إحصائيات الكلمات