为不会出现两次的标签创建随机颜色

时间:2016-01-02 16:43:03

标签: swift random arc4random

我正在开发我的第一个项目,我正在尝试为UILabel创建一个随机颜色(当按下按钮时),它不会连续两次重复。我已经阅读了很多问题并找到了生成随机数的代码,这些代码不会连续出现两次,但是,当我" link"那个随机数到UIColor和"链接"那个UIColor标签代码不再有效。此代码没有错误,但它允许相同的颜色出现两次;

@IBOutlet var HelloWorld: UILabel!
@IBOutlet var MyButton: UIButton!

@IBAction func MyButton(sender: AnyObject) {
let randomNumber2 = Int(arc4random_uniform(5))

    if randomNumber2 == 0 {
        HelloWorld.textColor = UIColor.redColor()
    }
    else if randomNumber2 == 1 {
        HelloWorld.textColor = UIColor.blueColor()
    }
    else if randomNumber2 == 2 {
        HelloWorld.textColor = UIColor.yellowColor()
    }
    else if randomNumber2 == 3 {
        HelloWorld.textColor = UIColor.orangeColor()
    }
    else if randomNumber2 == 4 {
        HelloWorld.textColor = UIColor.blueColor()
    }

有没有人知道如何为连续两次出现的标签生成随机颜色?

2 个答案:

答案 0 :(得分:0)

如果无法限制随机函数的结果,请存储结果,并通过检查生成的rand数组是否包含新的随机数来检查随机是否唯一。

struct UniqueRandomGenerator<T:Equatable> {

    var usedRandoms : [T] = []

    mutating func newRandom(randomGenerator:() -> T) -> T {

        var random = randomGenerator()
        while usedRandoms.contains(random) {
            random = randomGenerator()
        }
        usedRandoms.append(random)
        return random
    }
}
func randomGenerator() -> Float {
    return Float(arc4random())
}

var uniqueRandomGen = UniqueRandomGenerator<Float>() // not so elegant
uniqueRandomGen.newRandom(randomGenerator)

如果您可以限制结果(已知可能的值),您可以使用以下功能。

struct RandomSet<T:Equatable> {

    var set : [T] = []
    var unusedSet : [T] = []

    init(set:[T]) {
        self.set = set
        self.unusedSet = set
    }

    mutating func uniqueRandom() -> T {
        if (unusedSet.count == 0) {
            unusedSet = set
        }
        let randomNumber = Int(arc4random_uniform(UInt32(unusedSet.count)))
        return unusedSet.removeAtIndex(randomNumber)
    }
}
var randomColors = RandomSet(set: [UIColor.redColor(),UIColor.blueColor(),UIColor.yellowColor(),UIColor.orangeColor(),UIColor.greenColor()])
randomColors.uniqueRandom() // a random color

答案 1 :(得分:0)

您可以使用此Singleton

class ColorGenerator {
    static let sharedInstance = ColorGenerator()
    private var last: UIColor
    private var colors: [UIColor] = [.redColor(), .blueColor(), .yellowColor(), .orangeColor(), .greenColor()]

    private init() {
        let random = Int(arc4random_uniform(UInt32(colors.count)))
        self.last = colors[random]
        colors.removeAtIndex(random)
    }

    func next() -> UIColor {
        let random = Int(arc4random_uniform(UInt32(colors.count)))
        swap(&colors[random], &last)
        return last
    }
}

用法非常简单

第1步

在项目ColorGenerator.swift中创建一个新文件,然后将上面的代码粘贴到其中。

第2步

代码中的任何地方只需编写

即可
ColorGenerator.sharedInstance.next()

获取新的随机UIColor

enter image description here

就是这样。