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語句中的固定面值整潔。