Swift - Associated value or extension for an Enum Swift - Associated value or extension for an Enum swift swift

Swift - Associated value or extension for an Enum


Unfortunately you cannot define static properties based on enum cases, but you can use computed properties and switch to return values for each case:

enum Icon {    case plane    case arrow    case logo    case flag    var image: UIImage {        switch self {            case .plane: return UIImage(named: "plane.png")!            case .arrow: return UIImage(named: "arrow.png")!            case .logo: return UIImage(named: "logo.png")!            case .flag: return UIImage(named: "flag.png")!        }    }    var color: UIColor {        switch self {        case .plane: return UIColor.greenColor()        case .arrow: return UIColor.greenColor()        case .logo: return UIColor.greenColor()        case .flag: return UIColor.greenColor()        }    }}// usageIcon.plane.color


Using enums with associated values combined with switch statements you can be very flexible. A first example:

enum Icon {    case plane(img:UIImage, col:UIColor)    case arrow(img:UIImage, col:UIColor)    case logo(img:UIImage, col:UIColor)    case flag(img:UIImage, col:UIColor)    var values:(img:UIImage,col:UIColor) {        switch self {        case let .plane(image, color):            return (image,color)        case let .arrow(image, color):            return (image,color)        case let .logo(image, color):            return (image,color)        case let .flag(image, color):            return (image,color)        }    }}var a = Icon.plane(img: UIImage(named: "image.png")!, col: UIColor.blueColor())a.values.cola.values.img

and a second example:

enum Icon {    case plane(img:UIImage, col:UIColor)    case arrow(img:UIImage, col:UIColor)    case logo(img:UIImage, col:UIColor)    case flag(img:UIImage, col:UIColor)    var img:UIImage {        switch self {        case let .plane(image, color):            return image        case let .arrow(image, color):            return image        case let .logo(image, color):            return image        case let .flag(image, color):            return image        }    }    var col:UIColor {        switch self {        case let .plane(image, color):            return color        case let .arrow(image, color):            return color        case let .logo(image, color):            return color        case let .flag(image, color):            return color        }    }}var a = Icon.plane(img: UIImage(named: "image.png")!, col: UIColor.blueColor())a.cola.img

no need for extensions. And if you really do want static values, you could do this:

struct MyIcon {    static let plane = Icon.plane(img: UIImage(named: "image.png")!, col: UIColor.blueColor())    static let arrow = Icon.arrow(img: UIImage(named: "image.png")!, col: UIColor.blueColor())    static let logo = Icon.logo(img: UIImage(named: "image.png")!, col: UIColor.blueColor())    static let flag = Icon.flag(img: UIImage(named: "image.png")!, col: UIColor.blueColor())}MyIcon.arrow.col

which might be tidier than placing the fixed literal values inside a switch statement.


Shorter and safer code:

import UIKitenum Icon: String {    case plane, arrow, logo, flag    var image: UIImage {        // If the image is not available, provide a default value so we dont force optional unwrapping        return UIImage(named: "\(self.rawValue).png") ?? UIImage()    }    var color: UIColor {        switch self {        case .plane: return UIColor.green        case .arrow: return UIColor.green        case .logo: return UIColor.green        case .flag: return UIColor.green        }    }}// UsageIcon.plane.colorIcon.arrow.image