Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift enum function with string parameter calling with a parameter of the enum class

I'm trying to convert from a string to an enum key value, but I couldn't find any simple method so I hardcoded it, but it still won't work.

I tried using an enum function to return an enum key value from a string, but I can't call it with the string even though I declared it with a String as a parameter.

I then tried to move it to a different class, but the same thing happened.

My relevant code is below.

enum pickedColor: String {
case green = "71D25E"
case red = "FF0000"
case maroon = "800000"
case yellow = "FFFF00"
case olive = "808000"
case lime = "00FF00"
case aqua = "00FFFF"
case teal = "008080"
case blue = "0000FF"
case navy = "000080"
case fuchsia = "FF00FF"
case purple = "800080"

func toEnum(_ colorName: String) -> pickedColor {
    if colorName.elementsEqual("green") {
        return .green
    } else if colorName.elementsEqual("red") {
        return .red
    } else if colorName.elementsEqual("maroon") {
        return .maroon
    } else if colorName.elementsEqual("yellow") {
        return .yellow
    } else if colorName.elementsEqual("olive") {
        return .olive
    } else if colorName.elementsEqual("lime") {
        return .lime
    } else if colorName.elementsEqual("aqua") {
        return .aqua
    } else if colorName.elementsEqual("teal") {
        return .teal
    } else if colorName.elementsEqual("blue") {
        return .blue
    } else if colorName.elementsEqual("navy") {
        return .navy
    } else if colorName.elementsEqual("fuchsia") {
        return .fuchsia
    }  else {
        return .purple
    }
}

{

The code that shows up when I try to call it is this.Picture1

When manually completed, it still shows an error of cannot convert string to pickedColor.

I then moved the code to a new class, however, it still does not work.

class Color {

func toEnum(_ colorName: String) -> pickedColor {
    if colorName.elementsEqual("green") {
        return .green
    } else if colorName.elementsEqual("red") {
        return .red
    } else if colorName.elementsEqual("maroon") {
        return .maroon
    } else if colorName.elementsEqual("yellow") {
        return .yellow
    } else if colorName.elementsEqual("olive") {
        return .olive
    } else if colorName.elementsEqual("lime") {
        return .lime
    } else if colorName.elementsEqual("aqua") {
        return .aqua
    } else if colorName.elementsEqual("teal") {
        return .teal
    } else if colorName.elementsEqual("blue") {
        return .blue
    } else if colorName.elementsEqual("navy") {
        return .navy
    } else if colorName.elementsEqual("fuchsia") {
        return .fuchsia
    } else {
        return .purple
    }
}
}

The second picture of the wrong parameter is here. Picture2

What is going on?

like image 314
Bill Lee Avatar asked Nov 16 '25 18:11

Bill Lee


1 Answers

You need to make your toEnum function a static function since you are not calling it on a specific enum instance.

You should also name your enum starting with an uppercase letter.

And a switch is better than your long if/else. I would also consider dealing with an unknown color as well.

enum PickedColor: String {
    case green = "71D25E"
    case red = "FF0000"
    case maroon = "800000"
    case yellow = "FFFF00"
    case olive = "808000"
    case lime = "00FF00"
    case aqua = "00FFFF"
    case teal = "008080"
    case blue = "0000FF"
    case navy = "000080"
    case fuchsia = "FF00FF"
    case purple = "800080"

    static func toEnum(_ colorName: String) -> PickedColor? {
        switch colorName {
        case "green":
            return .green
        case "red":
            return .red
        case "maroon":
            return .maroon
        case "yellow":
            return .yellow
        case "olive":
            return .olive
        case "lime":
            return .lime
        case "aqua":
            return .aqua
        case "teal":
            return .teal
        case "blue":
            return .blue
        case "navy":
            return .navy
        case "fuchsia":
            return .fuchsia
        case "purple":
            return .purple
        default:
            return nil
        }
    }
}

Now you can call it as you tried:

if let color = PickedColor.toEnum(colorName) {
    // use color as needed
}
like image 171
rmaddy Avatar answered Nov 19 '25 08:11

rmaddy