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

Ios 如何从while循环中获取数据,ios,swift,while-loop,Ios,Swift,While Loop,标题几乎说明了一切 我有一个生成随机RGB值的函数,该值被转换为颜色 我只想要特定亮度范围内的颜色,所以我使用while循环创建RGB值,然后检查亮度,我希望它保持循环,直到它在亮度范围内生成颜色 我的问题是,我无法解决如何从while循环中获取数据以用作整个函数的一部分 编辑: 下面的代码不起作用,while循环没有返回randomcolor的值,Xcode只是给出了一个错误,说明在初始化之前正在使用它。即使我将return语句向上移动到for循环中,我也会得到一个错误,提示我没有返回UIco

标题几乎说明了一切

我有一个生成随机RGB值的函数,该值被转换为颜色

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

我的问题是,我无法解决如何从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
}
func randomColor()->UIColor{
var randomRed:CGFloat
绿色:CGFloat
蓝色:CGFloat
var randomcolor:UIColor
变量lum:CGFloat=0.0
而lum<50.0{
randomRed=CGFloat(arc4random_均匀(256))
randomGreen=CGFloat(arc4random_均匀(256))
随机蓝=CGFloat(arc4random_均匀(256))
lum=sqrt(随机红*随机红*0.241+随机绿*随机绿*0.691+随机蓝*随机蓝*0.068)
如果lum>50.0{
让颜色=rC(随机红色:随机红色,随机蓝色:随机蓝色,随机绿色:随机绿色)
颜色
}
}
返回随机颜色
}

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

现在,您和我可以查看此代码,并看到
lum
以0初始化,因此
while
将至少执行一次,但Swift不能以这种方式工作。它只看到唯一的赋值在一个条件块内,所以它会感到不安

通过去掉
if
语句,您可以稍微简化代码:

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)
}
func randomColor()->UIColor{
var randomRed:CGFloat=0.0
绿色变量:CGFloat=0.0
var randomBlue:CGFloat=0.0
变量lum:Float=0.0
而lum<50.0{
randomRed=CGFloat(浮点(arc4random_均匀(256)))
randomGreen=CGFloat(arc4random_均匀(256))
随机蓝=CGFloat(arc4random_均匀(256))
lum=浮点(sqrt(随机红*随机红*0.241+随机绿*随机绿*0.691+随机蓝*随机蓝*0.068))
}
返回rC(随机红色:随机红色,随机蓝色:随机蓝色,随机绿色:随机绿色)
}

您也可以只使用repeat while true,并仅在满足条件时返回颜色

注意:我使用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

上面的方法不起作用,for循环没有设置random color的值,即使我移动了return语句,整体函数也会抛出一个错误,提示我没有返回uicolor。我不知道我能清楚多少,我清楚地表明我无法从循环中获取值,这正是我试图做的。这些错误都源于我无法从循环中获取值这一事实。我最初的问题是如何从循环中获取数据,这仍然是个问题。别傻了,我按照你的要求添加了更多的信息。工作很有魅力。干杯,伙计,我是否总是最好将值设置为0,而不是将其保留为空?Swift的一个优点是,它可以尝试防止以后可能导致错误的错误,因此如果编译器认为您在初始化变量之前使用了该变量,那么它会告诉您。您还可以将变量声明为optionals,这样编译器就知道没有值是可以的,但是每次使用optional时,您都需要将其展开,因此这种方法更简单。检查语句是否为真是为了什么?这是一个无止境的循环。这永远是真的。只有当它进入你的状态并返回颜色时才会退出对不起,我还在学习如何编码的早期阶段。那么,我如何使它为假并强制它退出循环呢。是否是您放置的If语句将其切换为false?一旦返回值,它就会中断循环(exit)。请注意,它将只返回结果的颜色,如果它输入您的最低亮度条件哦,好的,那太棒了。谢谢你!