0Pricing
Android Academy · درس

الأنواع القابلة للقيمة الفارغة وغير القابلة لها

علامة النوع ?

الأنواع القابلة للقيمة الفارغة وغير القابلة لها درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.

أهمية أمان القيم الخالية

تحدث كثير من الأعطال في تطبيقات Android بسبب خطأ واحد: استخدام قيمة مفقودة فعليًا. في لغات أخرى، يتحول هذا إلى NullPointerException مخيف أثناء التشغيل.

تعالج Kotlin هذه المشكلة أثناء التجميع. إذ يتتبع نظام الأنواع القيم التي قد تكون null وتلك التي لا يمكن أن تكون كذلك أبدًا. يقدّم هذا الدرس أساسيات هذا النظام.

الأنواع غير الخالية

لا يمكن لنوع Kotlin، افتراضيًا، أن يحتوي على null. يشير String دائمًا إلى سلسلة نصية حقيقية.

إذا حاولت إسناد null إليه، فلن تُجمّع التعليمات البرمجية أصلًا. وهذا هو الإعداد الآمن الافتراضي.

fun main() {
    val name: String = "Ada"
    println(name.length)
}

رفض null

راقب ما يحدث عند محاولة وضع null في نوع غير خالٍ.

يمنعك المترجم فورًا. ولن تصل إلى وقت التشغيل مع خطأ خفي.

val name: String = null  // Compile error:
// Null can not be a value of a non-null type String

الأنواع القابلة للخلو باستخدام ?

قد تكون القيمة مفقودة فعلًا أحيانًا، مثل الاسم الأوسط الاختياري لأحد المستخدمين. للسماح بذلك، أضف ? إلى النوع.

يمكن أن يحتوي String? على سلسلة نصية حقيقية أو null. وتشير علامة الاستفهام إلى أن النوع قابل للخلو.

fun main() {
    val middleName: String? = null
    println(middleName)
}

نوعان مختلفان

لا يُعد String وString? النوع نفسه. فالنوع الثاني أوسع ويشمل القيمة null.

هذا الفرق هو ما يتيح للمترجم حمايتك. فهو يعرف بدقة أين يمكن أن تظهر null.

val sure: String = "hello"
val maybe: String? = "hello"
// maybe could later be null; sure never can

لا يمكنك استخدام النوع القابل للخلو مباشرةً

لن يسمح لك المترجم باستدعاء دالة على قيمة قابلة للخلو دون التحقق منها أولًا.

بما أن middleName قد تكون null، فإن استدعاء .length عليها يسبب خطأ أثناء التجميع. يجب معالجة حالة الخلو.

val middleName: String? = null
println(middleName.length)
// Error: only safe (?.) or non-null (!!) calls allowed

التحقق باستخدام if

إن أبسط طريقة لاستخدام قيمة قابلة للخلو هي التحقق منها باستخدام شرط if.

داخل الفرع الذي أثبتَّ فيه أنها ليست خالية، يحوّلها Kotlin تلقائيًا إلى نوع غير خالٍ، ولذلك تعمل .length.

fun main() {
    val text: String? = "Kotlin"
    if (text != null) {
        println(text.length)
    }
}

التحويلات الذكية

بعد نجاح التحقق من الخلو، يتذكر المترجم أن القيمة ليست خالية لبقية تلك الكتلة. ويُسمى ذلك تحويلًا ذكيًا.

لم تكتب أي تحويل بنفسك؛ فقد تتبعه Kotlin تلقائيًا نيابةً عنك.

fun describe(s: String?) {
    if (s == null) return
    // s is now treated as String here
    println("Length is " + s.length)
}

معاملات الدوال

تُعد قابلية المعامل للخلو جزءًا من عقد الدالة. يضمن المعامل غير الخالي للمتصلين أنه لن يستقبل null أبدًا.

ويشير المعامل القابل للخلو إلى أن الإدخال المفقود متوقع وتتم معالجته.

fun greet(name: String) {
    println("Hi, " + name)
}
// greet(null) would not compile

يمكن أن تكون أنواع الإرجاع قابلة للخلو

قد تعيد الدالة null للإشارة إلى عدم العثور على أي شيء. حدّد نوع الإرجاع بإضافة ?.

وبذلك يعرف المتصلون أنه يجب عليهم التحقق من النتيجة قبل استخدامها.

fun firstChar(s: String): Char? {
    if (s.isEmpty()) return null
    return s[0]
}

اجعل النوع غير خالٍ افتراضيًا

قاعدة جيدة: فضّل الأنواع غير الخالية. أضف ? فقط عندما يمكن أن تكون القيمة غائبة فعلًا.

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

// Prefer this:
val score: Int = 0
// Over this, unless null is meaningful:
val maybeScore: Int? = null

تحقق سريع

اختبر مدى فهمك للأنواع القابلة للخلو وغير القابلة للخلو.

مراجعة

تكون أنواع Kotlin غير خالية افتراضيًا، وترفض null أثناء التجميع. أضف ? إلى النوع لجعله قابلًا للخلو عندما تكون القيمة مفقودة.

لا يمكنك استخدام قيمة قابلة للخلو مباشرةً. إذ يحوّلها التحقق من الخلو إلى قيمة غير خالية، لتتمكن من استخدامها بأمان. ستتعلم لاحقًا طرقًا أقصر للتعامل مع القيم القابلة للخلو.

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

هل درس «الأنواع القابلة للقيمة الفارغة وغير القابلة لها» مجاني؟

نعم — نص درس «الأنواع القابلة للقيمة الفارغة وغير القابلة لها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.

ماذا ستتعلم في «الأنواع القابلة للقيمة الفارغة وغير القابلة لها»؟

علامة النوع ? تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟

لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «الأنواع القابلة للقيمة الفارغة وغير القابلة لها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟

نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الأنواع القابلة للقيمة الفارغة وغير القابلة لها
  2. الاستدعاءات الآمنة وElvis
  3. let وalso ودوال النطاق
  4. تجنّب NullPointerExceptions
← العودة إلى Android Academy