0Pricing
Kotlin Academy · درس

‏when شامل مع التسلسلات الهرمية المختومة

اكتب تعبيرات when كاملة تغطي كل متغيرات النوع المختوم.

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

when شاملة

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

when غير شاملة على نوع مفتوح

بالنسبة إلى الفئات العادية، لا يستطيع المصرّف التحقق من جميع الأنواع الفرعية، لذلك يتطلب فرع else.

open class Shape
class Circle : Shape()
class Square : Shape()
fun describe(s: Shape) = when (s) {
    is Circle -> "circle"
    is Square -> "square"
    else      -> "unknown" // required
}
fun main() { println(describe(Circle())) }

when شاملة على sealed

بالنسبة إلى sealed class، يعرف المصرّف جميع الأنواع الفرعية. ولا حاجة إلى else إذا غُطّيت كل حالة.

sealed class Result
class Success(val value: Int) : Result()
class Failure(val msg: String) : Result()
fun describe(r: Result) = when (r) {
    is Success -> "ok: ${r.value}"
    is Failure -> "err: ${r.msg}"
}
fun main() {
    println(describe(Success(42)))
    println(describe(Failure("nope")))
}

Sealed Interface

تمنحكم الواجهات sealed فحصًا شاملًا حتى عندما تحتاج الفئات إلى التوريث المتعدد.

sealed interface Animal
class Dog : Animal
class Cat : Animal
fun speak(a: Animal) = when (a) {
    is Dog -> "woof"
    is Cat -> "meow"
}
fun main() {
    println(speak(Dog()))
    println(speak(Cat()))
}

التحويلات الذكية في الفروع

داخل كل فرع is، يحوّل Kotlin المتغير تلقائيًا إلى النوع المحدد، فلا حاجة إلى إجراء تحويل يدوي.

sealed class Event
data class Click(val x: Int, val y: Int) : Event()
data class Key(val char: Char) : Event()
fun handle(e: Event) = when (e) {
    is Click -> "clicked at (${e.x},${e.y})" // smart-cast
    is Key   -> "key=${e.char}"
}
fun main() {
    println(handle(Click(10, 20)))
    println(handle(Key('A')))
}

نسيان حالة

إذا أضفتم متغيرًا جديدًا لاحقًا، فسيفشل كل تعبير when شامل لا يزال يستخدم النوع sealed كتعبير في الترجمة — وهذه شبكة أمان ممتازة.

sealed class Status
object Idle : Status()
object Running : Status()
// If we add object Done : Status(), every exhaustive when must update.
fun text(s: Status): String = when (s) {
    is Idle -> "idle"
    is Running -> "running"
}
fun main() { println(text(Idle)) }

sealed مع فئات البيانات

نمط شائع: استخدام فئات البيانات كمتغيرات ضمن تسلسل هرمي sealed.

sealed class UiState {
    object Loading : UiState()
    data class Success(val data: List<String>) : UiState()
    data class Error(val message: String) : UiState()
}
fun render(state: UiState) = when (state) {
    UiState.Loading -> "loading..."
    is UiState.Success -> "got ${state.data.size} items"
    is UiState.Error -> "error: ${state.message}"
}
fun main() {
    println(render(UiState.Loading))
    println(render(UiState.Success(listOf("a", "b"))))
    println(render(UiState.Error("404")))
}

استخدام when كتعليمة

عند استخدام when كتعليمة (وليس كتعبير)، لا يلزم أن تكون شاملة. لكنكم بذلك تتخلون عن شبكة الأمان.

sealed class Cmd
object Start : Cmd()
object Stop : Cmd()
fun execute(c: Cmd) {
    // Statement form: no error if incomplete (avoid this style)
    when (c) {
        Start -> println("started")
        Stop -> println("stopped")
    }
}
fun main() { execute(Start); execute(Stop) }

فرض الفحص الشامل على التعليمة

أسندوا when إلى قيمة (أو استخدموا حيلة .exhaustive) كي يفرض المصرّف معالجة جميع الحالات.

sealed class Cmd
object Start : Cmd()
object Stop : Cmd()
fun execute(c: Cmd) {
    val handled: Unit = when (c) { // expression context now
        Start -> println("started")
        Stop -> println("stopped")
    }
}
fun main() { execute(Start) }

الفروع متعددة الحالات

جمّعوا الحالات باستخدام الفواصل لمشاركة جسم واحد بين عدة متغيرات.

sealed class Event
class Click : Event()
class Tap : Event()
class Drag : Event()
fun isPointer(e: Event) = when (e) {
    is Click, is Tap, is Drag -> true
}
fun main() { println(isPointer(Tap())) }

الأنواع sealed المتداخلة

يمكن تداخل التسلسلات الهرمية sealed، ويظل الفحص الشامل فعالًا في الأشجار العميقة.

sealed class Network {
    sealed class Wifi : Network() {
        object Open : Wifi()
        data class Secured(val ssid: String) : Wifi()
    }
    object Cellular : Network()
}
fun describe(n: Network) = when (n) {
    Network.Wifi.Open -> "open wifi"
    is Network.Wifi.Secured -> "secured: ${n.ssid}"
    Network.Cellular -> "cellular"
}
fun main() {
    println(describe(Network.Wifi.Secured("home")))
    println(describe(Network.Cellular))
}

تحقق سريع

ما الفائدة الرئيسية من استخدام when مع التسلسلات الهرمية sealed؟

مراجعة

زاوجوا بين الفئات أو الواجهات sealed وwhen لضمان الشمول وقت الترجمة. وتبسّط التحويلات الذكية أجسام الفروع. استخدموا when كتعبير (أو أسندوا نتيجته) لفرض الفحص؛ وجمّعوا الحالات بالفواصل؛ واجعلوا الأنواع sealed متداخلة لتمثيل الحالة على شكل شجرة.

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

هل درس «‏when شامل مع التسلسلات الهرمية المختومة» مجاني؟

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

ماذا ستتعلم في «‏when شامل مع التسلسلات الهرمية المختومة»؟

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

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

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

كم من الوقت يستغرق درس «‏when شامل مع التسلسلات الهرمية المختومة»؟

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

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

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

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

  1. ‏sealed class مقابل sealed interface: متى تستخدم كلًّا منهما
  2. ‏when شامل مع التسلسلات الهرمية المختومة
  3. نمذجة حالة واجهة المستخدم باستخدام Sealed Classes
  4. تداخل التسلسلات الهرمية المختومة ودمجها
← العودة إلى Kotlin Academy