← Back to Swift Course | Chapter 10: Enums | Lesson 6 of 6

Recursive Enums क्या हैं

एक recursive enum वह है जिसके अंदर इसकी खुद की एक और copy हो सकती है, nested boxes के एक set जैसा जिसमें हर एक एक छोटा box रखता है।
Syntax
swift
indirect enum EnumName {
    case leaf(Type)
    case node(EnumName, EnumName)   // holds itself
}

func process(_ e: EnumName) -> Type {
    switch e {
    case .leaf(let v): return v
    case .node(let l, let r): return process(l) /* combine */ process(r)
    }
}

Declaring a Recursive Enum

किसी case को indirect चिह्नित करना इसे उसी enum का एक और instance रखने देता है, recursive, tree-like structures enable करते हुए।

उदाहरण: Declaring a Recursive Enum

markup
indirect enum ArithmeticExpression {
    // Case `number`
    case number(Int)
    // Enum case(s): `addition(ArithmeticExpression, ArithmeticExpression)`
    case addition(ArithmeticExpression, ArithmeticExpression)
}
// Declare a constant `expression`, set to `ArithmeticExpression.addition(.number(3), .number(4))`
let expression = ArithmeticExpression.addition(.number(3), .number(4))
// Print `expression` to the console
print(expression)

Evaluating a Recursive Enum

एक recursive function जो enum की structure को mirror करता है nested cases में से चल सकता है, उन्हें एक final result तक evaluate करते हुए।

उदाहरण: Evaluating a Recursive Enum

markup
indirect enum ArithmeticExpression {
    // Case `number`
    case number(Int)
    // Enum case(s): `addition(ArithmeticExpression, ArithmeticExpression)`
    case addition(ArithmeticExpression, ArithmeticExpression)
}
// Define the function `evaluate` taking `expression` and returning an Int
func evaluate(_ expression: ArithmeticExpression) -> Int {
    // Switch on `expression` and branch by case
    switch expression {
    // Case: `.number(let value)`
    case .number(let value):
        // Return `value` from this function
        return value
    // Case: `.addition(let left, let right)`
    case .addition(let left, let right):
        // Return `evaluate(left) + evaluate(right)` from this function
        return evaluate(left) + evaluate(right)
    }
}
// Declare a constant `expression`, set to `ArithmeticExpression.addition(.number(3), .addition(.number(4), .number(5)))`
let expression = ArithmeticExpression.addition(.number(3), .addition(.number(4), .number(5)))
// Print `evaluate(expression)` to the console
print(evaluate(expression))
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. किसी case (या पूरे enum) पर indirect keyword भूल जाना जो खुद को वापस refer करता है; इसके बिना, Swift type के लिए एक fixed size compute नहीं कर सकता।
  2. indirect case (एक case को indirection चाहिए चिह्नित करता है) को indirect enum (पूरे enum को चिह्नित करता है) के साथ confuse करना, दोनों ज़रूरत के अनुसार valid हैं।
  3. एक proper base case के बिना एक recursive enum पर एक recursive function लिखना, infinite recursion का कारण बनते हुए।
चैप्टर सारांश
  • एक case जो enum के अपने type को एक associated value के रूप में रखता है उसे indirect चिह्नित किया जाना चाहिए।
  • indirect Swift को उस case का data inline के बजाय एक pointer के ज़रिए store करने को कहता है।
  • Recursive enums nested structures model करने के लिए perfect हैं जैसे arithmetic expressions या linked lists।
  • किसी recursive enum को process करने वाले Functions आमतौर पर खुद recursion उपयोग करते हैं, हर case match करते हुए।
🔒

Chapter Quiz — Complete all 6 topics to unlock

0/6 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.