iosswift

iOS Swift, Enum CaseIterable extension


Im trying to write an extension for an enum that is CaseIterable so that i can get an array of the raw values instead of the cases, Im not entirely sure how to do that though

extension CaseIterable {

    static var allValues: [String] {
        get {
            return allCases.map({ option -> String in
                return option.rawValue
            })
        }
    }
}

i need to add a where clause somehow, if i dont have a where clause i get an error saying 'map' produces '[T]', not the expected contextual result type '[String]'

Anyone know if there is a good way of going about this?

my enums i want this function to work on look a bit like this

enum TypeOptions: String, CaseIterable {
    case All = "all"
    case Article = "article"
    case Show = "show"
}

Solution

  • Not all enumeration types have an associated RawValue, and if they have then it is not necessarily a String.

    Therefore you need to restrict the extension to enumeration types which are RawRepresentable, and define the return value as an array of RawValue:

    extension CaseIterable where Self: RawRepresentable {
    
        static var allValues: [RawValue] {
            return allCases.map { $0.rawValue }
        }
    }
    

    Examples:

    enum TypeOptions: String, CaseIterable {
        case all
        case article
        case show
        case unknown = "?"
    }
    print(TypeOptions.allValues) // ["all", "article", "show", "?" ]
    
    enum IntOptions: Int, CaseIterable {
        case a = 1
        case b = 4
    }
    print(IntOptions.allValues) // [1, 4]
    
    enum Foo: CaseIterable {
        case a
        case b
    }
    // This does not compile:
    print(Foo.allValues) // error: Type 'Foo' does not conform to protocol 'RawRepresentable'