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! «أعرف أن هذا لن يؤدي إلى throw». وإذا حدث ذلك، فسيتعطل برنامجك. استخدمه فقط عندما تتمكن من إثبات أن الاستدعاء آمن؛ وفي الشيفرة اليومية، فضّل 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

جرّب بنفسك

let parts = readLine()!.components(separatedBy: ",")

// TODO: enum NumError; func parseEven(_:) throws -> Int;
// لكل جزء، (try? parseEven(part)) ?? -1
quiz iconاختبر نفسك

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

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

تدرّب بنفسك: Playground لـ Swift