【问题标题】:choose random value from enum从枚举中选择随机值
【发布时间】:2017-02-17 13:54:50
【问题描述】:

我有一个UIColor extensionenum,名为myColors

enum myColors {
    static let backgroundColor = UIColor(hex: "#373737")
    static let strokeColor = UIColor(hex: "#FFFCF9")
    static let red = UIColor(hex: "#FF6978")
    static let green  = UIColor(hex: "#BCE784")
    static let blue   = UIColor(hex: "#B1DDF1")
    static let yellow = UIColor(hex: "#FFFD98")
    static let purple = UIColor(hex: "#A09ABC")
}

我正在尝试将sprite 颜色随机设置为这些颜色之一(红色、绿色、蓝色、黄色、紫色)。 我在 Stack Overflow 上找到了几个答案,但没有一个有效。 我试着这样做:

let sprite = Player(x,y,color: myColors(rawValue: myColors.purple.rawValue+1)

但它没有用。 Purple 是枚举中的最后一项,所以我选择了它。

【问题讨论】:

    标签: swift enums


    【解决方案1】:

    我建议避免将对象 UIColor 存储在 enum 中,我的做法是:

     enum myColors: String {
        case backgroundColor = "#373737"
        case strokeColor = "#FFFCF9"
        case red = "#FF6978"
        case green  = "#BCE784"
        case blue   = "#B1DDF1"
        case yellow = "#FFFD98"
        case purple = "#A09ABC"
    
    
        static func randomColor() -> UIColor {
            let colorsToGetRandomly = [myColors.red, myColors.green, myColors.blue, myColors.yellow, myColors.purple]
            let index = Int(arc4random_uniform(UInt32(colorsToGetRandomly.count)))
            let color = colorsToGetRandomly[index].rawValue
            return UIColor(hex: color)
        }
    }
    
    myColors.randomColor()
    

    【讨论】:

      【解决方案2】:

      按照@vadian 的回答,返回随机颜色……

      enum MyColors : String {
          case background = "#373737"
          case stroke = "#FFFCF9"
          case red = "#FF6978"
          case green = "#BCE784"
          case blue = "#B1DDF1"
          case yellow = "#FFFD98"
          case purple = "#A09ABC"
      
          private var uiColor : UIColor {
              return UIColor(hex: self)
          }
          private var all: [UIColor] {
              return [MyColors.background, .stroke, .red,… etc ]
          }
      
          var randomColor: UIColor {
              let index = Int(arc4random_uniform(UInt32(all.count)))
              return all[index].uiColor
          }
      
      }
      

      【讨论】:

      • 谢谢,我选择了第一个答案,但感谢您的努力:)
      • 我删除了我的答案,因为我忽略了 random 部分。
      • “枚举可能不包含存储的属性”
      • 更新了我的答案
      【解决方案3】:

      这里的技巧是让枚举 CaseIterable 使 .allCases 数组可用

      enum MyColors : String, CaseIterable {
          case background = "#373737"
          case stroke = "#FFFCF9"
          case red = "#FF6978"
          case green = "#BCE784"
          case blue = "#B1DDF1"
          case yellow = "#FFFD98"
          case purple = "#A09ABC"
      
          private var uiColor : UIColor {
              return UIColor(hex: self)
          }
      
          static func randomColor() -> UIColor {
              return MyColors.allCases[Int(arc4random_uniform(UInt32(MyColors.allCases.count)))].uiColor
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        如果您的枚举实现了CaseIterable,您可以使用allCases(),正如Richard 已经描述的那样。 除此之外,您还可以使用randomElement() 来获取随机值:

           MyColors.allcases.randomElement()
        

        【讨论】:

          猜你喜欢
          • 2018-07-07
          • 2020-09-10
          • 2013-10-20
          • 2019-03-20
          • 2014-08-06
          • 1970-01-01
          • 2016-05-18
          相关资源
          最近更新 更多