从枚举中随机选择一个值。

3

我有一个名为myColorsenum,它是一个UIColor扩展

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)

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

4个回答

9

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

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

4

接着 @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
    }

}

1
谢谢,我选择了第一个答案,但还是感谢你的努力 :) - swiftnewbie
我删除了我的回答,因为我忽视了“随机”的部分。 - vadian
枚举类型不允许包含存储属性。 - J. Doe
更新了我的回答。 - Ashley Mills

1
这里的技巧是使枚举成为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
    }

}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接