أنواع Result — Result<T, Error>
مثّل النجاح أو الفشل من دون الرمي باستخدام Result . أنشئ النتائج، وبدّل بينها باستخدام switch، واستخدم map وflatMap، واربطها بعمليات throws وإليها.
أنواع Result — Result<T, Error> درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.
لماذا Result؟
الهدف: استخدم Result<T, Error> لإرجاع نجاح أو فشل بشكل صريح، وهو مناسب للـ callbacks أو واجهات API التي تتجنب throws.
إنشاء Result
أنشئ .success(value) أو .failure(error) بدلًا من إطلاق خطأ.
enum ParseError: Error { case badInt }
func parseInt(_ s: String) -> Result<Int, Error> {
if let n = Int(s) { return .success(n) }
else { return .failure(ParseError.badInt) }
}
print(parseInt("42"))
print(parseInt("nope"))استخدام switch مع Result
عالج النتائج باستخدام switch للحفاظ على وضوح مساري النجاح والفشل.
let r = parseInt("10")
switch r {
case .success(let n): print("number =", n)
case .failure(let e): print("error:", e)
}تحويل Results
حوّل النجاح باستخدام map، واربط العمليات التي تنتج Result باستخدام flatMap، وكيّف الأخطاء باستخدام mapError.
let r1 = parseInt("5").map { $0 * 2 } // Result<Int, Error>
let r2 = parseInt("x").map { $0 * 2 } // still .failure
let r3 = parseInt("8").flatMap { n in // chain Results
n % 2 == 0 ? .success(n/2) : .failure(ParseError.badInt)
}
let rErr = parseInt("x").mapError { $0 } // transform error type if needed
print(r1, r2, r3, rErr)Throws ← Result
استخدم Result { try ... } لالتقاط استدعاء يُطلق خطأ وتحويله تلقائيًا إلى Result.
enum LoadError: Error { case notFound }
func load(text name: String) throws -> String {
guard name == "ok" else { throw LoadError.notFound }
return "loaded"
}
// Build a Result from a throwing call:
let res = Result { try load(text: "ok") } // .success("loaded")
let res2 = Result { try load(text: "missing") } // .failure(LoadError.notFound)
print(res, res2)Result ← throws
استدعِ get() لإعادة إطلاق الخطأ من Result، والعودة بذلك إلى الشيفرة التي تستخدم إطلاق الأخطاء.
let outcome = parseInt("12")
do {
let value = try outcome.get() // throws if .failure
print("value =", value)
} catch {
print("thrown from get():", error)
}معنى Result
تحقق سريع: ماذا يمثل Result<T, Error>؟
مراجعة
مراجعة: أنشئ قيم Result، وعالجها باستخدام switch، وحوّلها عبر map/flatMap/mapError، واربط بينها وبين throws باستخدام مُهيئ Result { try ... } وget().
الأسئلة الشائعة
هل درس «أنواع Result — Result<T, Error>» مجاني؟
نعم — نص درس «أنواع Result — Result<T, Error>» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.
ماذا ستتعلم في «أنواع Result — Result<T, Error>»؟
مثّل النجاح أو الفشل من دون الرمي باستخدام Result . أنشئ النتائج، وبدّل بينها باستخدام switch، واستخدم map وflatMap، واربطها بعمليات throws وإليها. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.
كم من الوقت يستغرق درس «أنواع Result — Result<T, Error>»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- السلسلة الاختيارية وأساسيات معالجة الأخطاء
- do/catch وتعريف الأخطاء (Enums)
- أنواع Result — Result