Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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 الكاملة.

challenge icon

التحدي

سهل

قم بتعريف 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق والتدفق