12

有关快速枚举的一般问题。Swift - Enum的关联值或扩展

我要创建“图标”和“准”的值的枚举枚举情况下

enum Icon { 
    case plane 
    case arrow 
    case logo 
    case flag 
} 

我想创建一个相关的图像,以枚举的值。 而且也是一个相关的颜色的枚举值

因此,举例来说,如果有可能做这样的事情:

extension Icon.plane { 
    var image = { 
    get { 
     return UIImage("plane.png") 
    } 
    } 
    var color = { 
    get { 
     return UIColor.greenColor() 
    } 
    } 
} 


var image = Icon.arrow.image // the image associated to the enum 
var color = Icon.arrow.color // the color associated to the enum 

是这种类型的东西可能吗?

回答

27

不幸的是根据枚举情况下,你不能定义静态属性,但你可以使用计算性能和switch为每种情况下返回值:

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() 
     } 
    } 
} 

// usage 
Icon.plane.color 
6

将关联值与枚举语句结合使用枚举可以非常灵活。第一示例:

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.col 
a.values.img 

和第二个例子:

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.col 
a.img 

不需要扩展。如果你确实想静态值,你可以这样做:

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 

这可能比将在switch语句中的固定面值整洁。