Optional / Nullable — آليتا اللغتين Swift و Kotlin للعمل الآمن مع غياب القيمة. Optional في Swift والأنواع القابلة للعدم في Kotlin تحلان مشكلة واحدة — مرجع null — ولكن بأساليب تركيبية ودلالية مختلفة. وفقًا لـ Swift.org, 2026، تلغي الأنواع الاختيارية فئة كاملة من الأخطاء المتعلقة بـ nil، وتنقل التحقق من null إلى مرحلة الترجمة.
الرئيسية
Optional في Swift و nullable في Kotlin هما أداتان لغويتان تجعلان null جزءًا صريحًا من نظام الأنواع. في Swift، Optional هو enum: Optional.none (nil) و Optional.some(Wrapped). في Kotlin، يُشار إلى nullable باللاحقة ? في النوع: String? يمكن أن يكون سلسلة نصية أو null.
كلا المنهجيتين تحلان المشكلة الأساسية التي أطلق عليها Tony Hoare اسم «خطأ المليار دولار» — مرجع null. قبل ظهور الأنواع الاختيارية، كان أي مرجع يمكن أن يكون null، وكان التحقق متروكًا للمطور. Swift و Kotlin ينقلان هذا التحقق إلى مرحلة الترجمة: الكود الذي يتجاهل null لن يتم ترجمته.
على الرغم من الهدف المشترك، فإن Swift و Kotlin تنفذان أمان null بطرق مختلفة. Swift تستخدم النوع الجبري Optional مع مطابقة الأنماط الكاملة. Kotlin تدمج nullable في نظام الأنواع على مستوى المترجم دون إنشاء نوع غلاف منفصل.
تاريخيًا، ظهر مرجع null في عام 1965 في لغة ALGOL W كوسيلة لتمثيل غياب القيمة. على مدى ستة عقود، أصبح null مصدرًا لعدد لا يحصى من الأعطال — وفقًا لبحث Tony Hoare، فإن 30 إلى 50 بالمائة من الأخطاء في كود الإنتاج مرتبطة بـ NullPointerException. أصبحت Swift مع Optional و Kotlin مع الأنواع القابلة للعدم أول اللغات السائدة التي حلت هذه المشكلة على مستوى نظام الأنواع، مما جعل null جزءًا صريحًا من عقد الدالة.
في Swift، Optional هو نوع مكتمل يُعلن كـ enum Optional<Wrapped>. السكر التركيبي ? يستبدل الترميز الكامل: Int? يعادل Optional<Int>. يتضمن العمل مع Optional عدة طرق لاستخراج القيمة.
if let — استخراج شرطي: إذا كان Optional يحتوي على قيمة، فإنها ترتبط بثابت داخل الكتلة. guard let — خروج مبكر من الدالة إذا كان Optional يساوي nil. guard let يجعل الكود مسطحًا، متجنبًا if-let المتداخلة.
التسلسل الاختياري (الوصول الآمن المتسلسل) عبر ? يسمح باستدعاء طريقة أو خاصية على Optional دون unwrapping صريح. إذا كانت أي حلقة في السلسلة هي nil، فإن السلسلة بأكملها ترجع nil. هذا يقلل من الكود عند العمل مع البيانات الهرمية.
?? (nil-coalescing) — عامل يُرجع قيمة Optional إذا لم تكن nil، وإلا يُرجع قيمة افتراضية. إنه بديل موجز لـ if-let لتوفير قيمة احتياطية.
var name: String? = "Alice"
// If-let binding
if let unwrapped = name {
print("مرحبًا، \(unwrapped)")
}
// Optional chaining
let count = name?.count
// Nil-coalescing
let display = name ?? "ضيف"
// Map على Optional
let greeting = name.map { "Hello, \($0)" }
في Kotlin، nullable هو جزء من نظام الأنواع، وليس نوع غلاف منفصل. النوع String? يمكن أن يحتوي على null، بينما String (بدون علامة الاستفهام) لا يمكن أبدًا. يتتبع المترجم nullable عبر التحويل الذكي والتعليقات التوضيحية.
?. — عامل الاستدعاء الآمن. إذا لم يكن الكائن null، يتم استدعاء الطريقة أو الخاصية؛ إذا كان null — يُرجع null دون استدعاء. هذا مماثل للتسلسل الاختياري في Swift، لكنه أقصر تركيبًا.
?: — نظير nil-coalescing في Kotlin. إذا كان التعبير الأيسر ليس null، فإنه يُرجع؛ وإلا — القيمة على اليمين. غالبًا ما يُدمج عامل إلفيس مع الخروج المبكر عبر return أو throw.
التحويل الذكي — مترجم Kotlin يحول تلقائيًا nullable إلى non-null بعد التحقق من null في if أو when. !! — unwrapping إجباري يرمي NullPointerException عند null. استخدم !! فقط عندما يكون null خطأ.
val name: String? = "Alice"
// استدعاء آمن
val length = name?.length
// عامل إلفيس
val display = name ?: "ضيف"
// تحويل ذكي بعد التحقق
if (name != null) {
println("الطول: ${name.length}")
}
// Let مع لامدا
name?.let { println("مرحبًا، $it") }
// Force unwrap — فقط عندما تكون متأكدًا
val forced = name!!
على الرغم من أن Swift و Kotlin تحلان نفس المهمة، إلا أن منهجياتهما في أمان null تختلف جوهريًا. فهم هذه الاختلافات مهم للمطورين الذين يعملون مع كلتا المنصتين.
Swift تستخدم enum Optional — نوع جبري قياسي. Kotlin تدمج nullable على مستوى نظام أنواع المترجم دون إنشاء كائن غلاف. هذا يؤثر على الأداء: Optional في Swift هو كائن في heap، بينما nullable في Kotlin هو تحقق من null دون تخصيص ذاكرة.
تركيب Kotlin أقصر بفضل العوامل المدمجة ?., ?:, !!. Swift يتطلب تركيبًا أكثر صراحة: if let و guard let و map على Optional. ومع ذلك، يوفر Swift مطابقة الأنماط عبر switch، والتي لا يدعمها Kotlin مباشرة للقابلة للعدم.
| السيناريو | Swift | Kotlin |
|---|---|---|
| التصريح | var name: String? | val name: String? |
| الاستدعاء الآمن | name?.count | name?.length |
| القيمة الافتراضية | name ?? «ضيف» | name ?: «ضيف» |
| الاستخراج الشرطي | if let x = name | name?.let { x -> } |
| Force unwrap | name! | name!! |
في تطوير التطبيقات المحمولة، ظهرت أنماط قياسية للعمل مع الأنواع الاختيارية تقلل من الكود المتكرر وتزيد الأمان.
Swift و Kotlin تدعمان map و flatMap لـ Optional و nullable. إذا كانت هناك قيمة، يتم تطبيق تحويل؛ إذا كان null — يُرجع null. هذا يلغي الفحوصات if-let المتداخلة.
بدلاً من if-let + else، استخدم ?: أو ?? مع قيمة افتراضية. هذا يجعل الكود تصريحيًا: «استخدم X إذا كان متاحًا، وإلا Y» بدلاً من الفحص الإجرائي.
في Jetpack Compose و SwiftUI، تتحكم الأنواع الاختيارية في العرض: إذا كانت الحالة null — أخفِ المكون، وإلا اعرضه. هذا يتبع مبدأ المصدر الوحيد للحقيقة.
data class UserState(
val name: String?,
val email: String?
)
// تحويل ذكي في when مع متغيرات مختلفة
fun greeting(state: UserState): String = when {
state.name != null && state.email != null ->
"${state.name} (${state.email})"
state.name != null -> state.name
else -> "ضيف"
}
// Compose: العرض حسب الوجود
@Composable
fun UserProfile(name: String?) {
name?.let {
Text(text = it)
} ?: Text(text = "لا توجد بيانات")
}
لترحيل كود Java الحالي إلى Kotlin، يُوصى باستخدام التعليقات التوضيحية @Nullable و @NonNull من حزمة androidx.annotation. مترجم Kotlin يراعي هذه التعليقات التوضيحية أثناء interop مع Java، مما يجعل الأنواع المقابلة قابلة للعدم أو غير قابلة للعدم تلقائيًا. الترحيل التدريجي مع التعليقات التوضيحية الصريحة أكثر أمانًا من التمكين العالمي لأمان null في المشروع.
أمان null يقلل من عدد الأخطاء، لكنه لا يزيلها تمامًا. يرتكب المطورون غالبًا أخطاء مميزة عند العمل مع الأنواع الاختيارية.
الأسئلة الشائعة
Swift Optional هو enum بحالتي some و none، كائن في heap. Kotlin nullable هو تعليق توضيحي في نظام الأنواع، يتم التحقق منه بواسطة المترجم دون إنشاء غلاف. Kotlin أكثر إيجازًا تركيبًا، Swift أقوى في مطابقة الأنماط.
Java لا تحتوي على أمان null مدمج. Optional (Java 8+) مشابه لـ Swift Optional، لكنه غلاف بتكلفة إضافية. التعليقات التوضيحية @Nullable و @NonNull تساعد المحلل الثابت، لكنها لا تضمن الأمان.
?.let مناسب لتسلسل العمليات: تطبيق تحويل، حفظ في قاعدة البيانات، تحديث واجهة المستخدم — كل شيء في كتلة واحدة. if مع التحقق من null أفضل للشروط المعقدة مع متغيرات nullable متعددة.
Swift Optional هو enum مع تخزين غير مباشر للأنواع الكبيرة، مما قد يسبب تخصيص ذاكرة. Kotlin nullable هو تحقق من null دون تكلفة إضافية. للمسارات الساخنة (recycler view، الرسوم المتحركة)، Kotlin أكثر كفاءة.
استخدم nullable فقط عندما يكون الحقل غائبًا فعليًا: بيانات الملف الشخصي الاختيارية، الإعدادات غير الإلزامية. إذا كان الحقل دائمًا مملوءًا، استخدم non-null مع قيمة افتراضية عبر عامل إلفيس أثناء الإنشاء.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا