(DIR) Home
 (DIR) Blog posts
       
       Even Swifter Enums
       
       4 June, 2024
       
       QUOTE
       This post was translated from HTML, inevitably some things will have changed or no longer apply - July 2025
       END QUOTE
       
       Swift's enums can have associated values, which are stored values that can be different for each instance of an enum, as well as raw values, & those can't change. Raw values must also conform to the RawRepresentable protocol, which means they have to be Strings, Ints, Floats, or whatever OptionSets are.
       
       How to return other things as raw values isn't obvious, but help is at hand. Just like with structs and classes you can declare a function on an enum, & those can return any kind of value you'd like, including more complex types like a struct, whatever.
       
       CODE
       struct Possible {
           let orange: Int,
               bear: Int
       }
       
       enum fruit {
           case apple,
           pear
       
           func raw() -> Possible {
               switch self {
               case .apple:
                   return Possible(orange: 1, bear: 2)
               case .pear:
                   return Possible(orange: 3, bear: 4)
               }
           }
       }
       
       print(fruit.apple.raw()) // prints Possible(orange: 1, bear: 2)
       END CODE
       
       This approach also makes it possible to use a more meaningful name than raw.
       
       It also carries across to other languages without a concept of an enum's raw value. It was while using Rust on one of my occasional excursions to the language that the idea hit me. Rust doesn't have raw values for its enums but does allow function to be declared on them.