Optional / Nullable — المفاهيم الأساسية والعمل مع الأنواع القابلة للعدم

المؤلف: IT Sectr نُشر: 2026-05-26 وقت القراءة: 8 دق

Optional / Nullable — آليتا اللغتين Swift و Kotlin للعمل الآمن مع غياب القيمة. Optional في Swift والأنواع القابلة للعدم في Kotlin تحلان مشكلة واحدة — مرجع null — ولكن بأساليب تركيبية ودلالية مختلفة. وفقًا لـ Swift.org, 2026، تلغي الأنواع الاختيارية فئة كاملة من الأخطاء المتعلقة بـ nil، وتنقل التحقق من null إلى مرحلة الترجمة.

الرئيسية

  • Optional — نوع Swift يتم تمثيله كـ enum بحالتين: some(Value) و none.
  • Nullable — في Kotlin يُشار إليه بعلامة استفهام بعد النوع (String?)، والاستدعاء الآمن عبر ?.
  • Type safety — كلا الآليتين تضمنان معالجة قيم null بشكل صريح في وقت الترجمة.
  • Unwrapping — Swift يستخدم if let و guard let و force unwrap (!). Kotlin يستخدم ?. و !! وعامل إلفيس ?:.
  • Interop — Kotlin و Swift يتفاعلان مع قاعدة بيانات قابلة للعدم عبر التعليقات التوضيحية والأنواع الخاصة (Implicitly Unwrapped Optional).

ما هما Optional و Nullable؟

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 جزءًا صريحًا من عقد الدالة.

Optional في Swift: البنية والعمل مع الأنواع الاختيارية

في Swift، Optional هو نوع مكتمل يُعلن كـ enum Optional<Wrapped>. السكر التركيبي ? يستبدل الترميز الكامل: Int? يعادل Optional<Int>. يتضمن العمل مع Optional عدة طرق لاستخراج القيمة.

ربط if-let و guard-let

if let — استخراج شرطي: إذا كان Optional يحتوي على قيمة، فإنها ترتبط بثابت داخل الكتلة. guard let — خروج مبكر من الدالة إذا كان Optional يساوي nil. guard let يجعل الكود مسطحًا، متجنبًا if-let المتداخلة.

التسلسل الاختياري

التسلسل الاختياري (الوصول الآمن المتسلسل) عبر ? يسمح باستدعاء طريقة أو خاصية على Optional دون unwrapping صريح. إذا كانت أي حلقة في السلسلة هي nil، فإن السلسلة بأكملها ترجع nil. هذا يقلل من الكود عند العمل مع البيانات الهرمية.

عامل الدمج مع nil

?? (nil-coalescing) — عامل يُرجع قيمة Optional إذا لم تكن nil، وإلا يُرجع قيمة افتراضية. إنه بديل موجز لـ if-let لتوفير قيمة احتياطية.

swift
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)" }

Nullable في Kotlin: الاستدعاءات الآمنة وعامل إلفيس

في 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 خطأ.

kotlin
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!!

Optional مقابل Nullable: الاختلافات الرئيسية في المنهجيات

على الرغم من أن 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 مباشرة للقابلة للعدم.

السيناريوSwiftKotlin
التصريحvar name: String?val name: String?
الاستدعاء الآمنname?.countname?.length
القيمة الافتراضيةname ?? «ضيف»name ?: «ضيف»
الاستخراج الشرطيif let x = namename?.let { x -> }
Force unwrapname!name!!

أنماط أمان null في تطوير التطبيقات المحمولة

في تطوير التطبيقات المحمولة، ظهرت أنماط قياسية للعمل مع الأنواع الاختيارية تقلل من الكود المتكرر وتزيد الأمان.

Map و flatMap على Optional

Swift و Kotlin تدعمان map و flatMap لـ Optional و nullable. إذا كانت هناك قيمة، يتم تطبيق تحويل؛ إذا كان null — يُرجع null. هذا يلغي الفحوصات if-let المتداخلة.

القيم الافتراضية عبر إلفيس

بدلاً من if-let + else، استخدم ?: أو ?? مع قيمة افتراضية. هذا يجعل الكود تصريحيًا: «استخدم X إذا كان متاحًا، وإلا Y» بدلاً من الفحص الإجرائي.

Nullable في Compose و SwiftUI

في Jetpack Compose و SwiftUI، تتحكم الأنواع الاختيارية في العرض: إذا كانت الحالة null — أخفِ المكون، وإلا اعرضه. هذا يتبع مبدأ المصدر الوحيد للحقيقة.

kotlin
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 في المشروع.

الأخطاء الشائعة عند العمل مع Optional و Nullable

أمان null يقلل من عدد الأخطاء، لكنه لا يزيلها تمامًا. يرتكب المطورون غالبًا أخطاء مميزة عند العمل مع الأنواع الاختيارية.

  • Force unwrap دون ضمان — name! أو name!! دون التأكد من أن القيمة ليست nil يؤدي إلى تعطل في الإنتاج. تحقق من null قبل force unwrap.
  • if-let المفرط — if-let المتداخلة لثلاثة Optional أو أكثر تخلق هرمًا من doom. استخدم guard let أو flatMap.
  • تجاهل nil-coalescing — الفحص الصريح عبر if-let مع كتلة else يمكن استبداله بـ ?? أو ?:، مما يقلل الكود ويحسن readability.
  • Nullable في واجهات برمجة التطبيقات العامة — إذا كانت الدالة تقبل nullable، فإن كل استدعاء يتطلب فحصًا. فضل non-null مع قيمة افتراضية أو تحميل زائد.

الأسئلة الشائعة

ما الفرق بين Kotlin Nullable و Swift Optional؟

Swift Optional هو enum بحالتي some و none، كائن في heap. Kotlin nullable هو تعليق توضيحي في نظام الأنواع، يتم التحقق منه بواسطة المترجم دون إنشاء غلاف. Kotlin أكثر إيجازًا تركيبًا، Swift أقوى في مطابقة الأنماط.

هل يوجد أمان null في Java؟

Java لا تحتوي على أمان null مدمج. Optional (Java 8+) مشابه لـ Swift Optional، لكنه غلاف بتكلفة إضافية. التعليقات التوضيحية @Nullable و @NonNull تساعد المحلل الثابت، لكنها لا تضمن الأمان.

متى استخدام ?.let في Kotlin بدلاً من if-let؟

?.let مناسب لتسلسل العمليات: تطبيق تحويل، حفظ في قاعدة البيانات، تحديث واجهة المستخدم — كل شيء في كتلة واحدة. if مع التحقق من null أفضل للشروط المعقدة مع متغيرات nullable متعددة.

كيف يؤثر Optional على الأداء؟

Swift Optional هو enum مع تخزين غير مباشر للأنواع الكبيرة، مما قد يسبب تخصيص ذاكرة. Kotlin nullable هو تحقق من null دون تكلفة إضافية. للمسارات الساخنة (recycler view، الرسوم المتحركة)، Kotlin أكثر كفاءة.

هل يجب استخدام nullable لحقول data class؟

استخدم nullable فقط عندما يكون الحقل غائبًا فعليًا: بيانات الملف الشخصي الاختيارية، الإعدادات غير الإلزامية. إذا كان الحقل دائمًا مملوءًا، استخدم non-null مع قيمة افتراضية عبر عامل إلفيس أثناء الإنشاء.

الملخص

  • Optional (Swift) و Nullable (Kotlin) — آليتان لغويتان تنقلان معالجة null إلى وقت الترجمة وتمنعان NPE.
  • Swift Optional هو enum بحالتين، يوفر مطابقة الأنماط و map/flatMap. Kotlin nullable هو جزء من نظام الأنواع مع عوامل مضغوطة ?., ?:, !!.
  • التسلسل الاختياري (Swift ?.) و الاستدعاء الآمن (Kotlin ?.) يسمحان بالعمل مع البيانات الهرمية دون فحوصات متداخلة.
  • Nil-coalescing (??) و عامل إلفيس (?:) يوفران قيمًا افتراضية دون فروع if-else صريحة.
  • التحويل الذكي في Kotlin يحول تلقائيًا nullable إلى non-null بعد التحقق، مما يقلل من عدد التحويلات الصريحة.
  • تجنب force unwrap (! / !!) في الإنتاج، و if-let المفرط، والأنواع القابلة للعدم في واجهات برمجة التطبيقات العامة دون ضرورة.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا