我如何从while循环中获取数据

时间:2017-02-02 02:11:49

标签: ios swift while-loop

标题几乎说明了一切。

我有一个函数可以生成随机RGB值,并将其转换为颜色。

我只想要特定亮度范围内的颜色,所以我使用while循环来创建RGB值,然后检查亮度的想法是我希望它保持循环,直到它在亮度范围内生成颜色。 / p>

我的问题是我无法弄清楚如何从while循环中获取数据以用作整体功能的一部分

编辑: 下面的代码不起作用,while循环没有返回randomcolor的值,Xcode只是给出一个错误,说明它在初始化之前被使用。即使我将return语句移动到for循环中,我只是得到一个错误的整体语句建议我没有返回UIcolor。我想要做的是从while循环中获取颜色值,以便它可以在while循环之外使用。

func randomColor() -> UIColor{
    var randomRed:CGFloat
    var randomGreen:CGFloat
    var randomBlue: CGFloat
    var randomcolor: UIColor
    var lum: CGFloat = 0.0
    while lum < 50.0 {
        randomRed = CGFloat(arc4random_uniform(256))
        randomGreen = CGFloat(arc4random_uniform(256))
        randomBlue = CGFloat(arc4random_uniform(256))
        lum = sqrt(randomRed * randomRed * 0.241 + randomGreen * randomGreen * 0.691 + randomBlue * randomBlue * 0.068)
        if lum > 50.0{
        let color = rC(randomRed: randomRed, randomBlue: randomBlue, randomGreen: randomGreen)
        randomcolor = color

        }
    }
    return randomcolor
}

2 个答案:

答案 0 :(得分:2)

您的问题是您在函数的开头声明了变量,但没有初始化它们。将在randomcolor循环内为它们分配一个值,但循环可能会执行零次,导致lum在您尝试保留之前未初始化。

现在,您和我可以查看此代码并看到while初始化为0,因此if将至少执行一次,但Swift不会那样工作。它只是看到唯一的赋值在条件块内,所以它会被沮丧。

您可以通过删除func randomColor() -> UIColor { var randomRed:CGFloat = 0.0 var randomGreen:CGFloat = 0.0 var randomBlue:CGFloat = 0.0 var lum: Float = 0.0 while lum < 50.0 { randomRed = CGFloat(Float(arc4random_uniform(256))) randomGreen = CGFloat(arc4random_uniform(256)) randomBlue = CGFloat(arc4random_uniform(256)) lum = Float(sqrt(randomRed * randomRed * 0.241 + randomGreen * randomGreen * 0.691 + randomBlue * randomBlue * 0.068)) } return rC(randomRed: randomRed, randomBlue: randomBlue, randomGreen: randomGreen) } 语句来简化代码:

Roll_Click

答案 1 :(得分:1)

您也可以在true时使用repeat,只有在满足条件时才返回颜色。

注意:我使用UIColor来说明方法:

extension UIColor {
    static var random: UIColor {
        repeat {
            let red = CGFloat(arc4random_uniform(256))
            let green = CGFloat(arc4random_uniform(256))
            let blue = CGFloat(arc4random_uniform(256))
            if sqrt( pow(red, 2) * 0.241 + pow(green, 2) * 0.691 + pow(blue, 2) * 0.068) > 50 {
                return UIColor(red: red / 255, green: green / 255, blue: blue / 255, alpha: 1)
            }
        } while true
    }
}

用法:

let color1: UIColor = .random  //  r 0.894 g 0.757 b 0.192 a 1.0
let color2: UIColor = .random  //  r 0.133 g 0.357 b 0.824 a 1.0
let color3: UIColor = .random  //  r 0.675 g 0.875 b 0.278 a 1.0
let color4: UIColor = .random  //  r 0.867 g 0.184 b 0.533 a 1.0