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

Creating a random color to a label that does not appear twice

我正在处理我的第一个项目,我试图为 UILabel(按下按钮时)创建一种随机颜色,该颜色不会连续重复两次。我已经阅读了很多问题并找到了生成随机数的代码,这些随机数不会连续出现两次,但是,当我 "link" 那个随机数到一个 UIColor 并且 "link" 那个 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()
    }

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

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

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

你可以用这个Singletonclass

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

就是这样。