我正在开发我的第一个项目,我正在尝试为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()
}
有没有人知道如何为连续两次出现的标签生成随机颜色?
答案 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
}
}
用法非常简单
在项目ColorGenerator.swift
中创建一个新文件,然后将上面的代码粘贴到其中。
代码中的任何地方只需编写
即可ColorGenerator.sharedInstance.next()
获取新的随机UIColor
。
就是这样。