2017-02-02 1 views
0

제목에 거의 모두 나와 있습니다.while 루프에서 데이터를 가져 오는 방법

색상으로 변환되는 임의의 RGB 값을 생성하는 함수가 있습니다.

나는 휘도 범위 내에서 색상을 생성 할 때까지 루핑을 계속하기를 원하는 아이디어로 휘도를 확인하면서 특정 루미넌스 범위 내에서만 색상을 원한다. 그래서 나는 while 루프를 사용하여 RGB 값을 만든다. 는 아래 작동하지 않는, while 루프가되지 않습니다 :

내 문제는 내가

편집 전체 기능의 일부로 사용하는 while 루프에서 데이터를 얻는 방법 작동하지 않을 수 있다는 것입니다 randomcolor에 대한 값을 반환하는 경우 Xcode는 초기화되기 전에 사용 중이라는 오류를 표시합니다. 반환 문을 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 
} 
+0

루프 나던에 대한 임의의 색상의 값을 설정 위의 나던 작업, 심지어 내가 만약 그냥 접근 방식을 설명하기 위해 UIColor를 사용했다 Return 문을 움직이면 전반적인 함수가 UIcolor를 리턴했다는 사실을 알리는 에러를 던진다. – Mick

+0

내가 얼마나 명확한 지 모르겠다. 분명히 내가 시도하고있는 루프의 가치를 얻을 수 없다고 분명히 진술했다. 할 것. 오류는 모두 루프에서 값을 가져올 수 없다는 사실에서 비롯됩니다. 내 원래의 질문은 어떻게 여전히 질문입니다 루프 밖으로 데이터를 얻을 수 있습니다. 네가 묻는 것처럼 더 많은 정보를 추가했기 때문에 엉덩이가되지 마라. – Mick

답변

2

문제는 함수를 시작할 때 변수를 선언하지만 초기화하지 않는 것입니다. 루프는 while 루프 내에서 값이 할당되지만 루프는 0 회 실행될 수 있으므로 예약하기 전에 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) 
} 
+0

매력처럼 작동했습니다. 환호하는 사람, 나는 항상 값을 0으로 설정하는 것이 좋을까요? – Mick

+0

Swift에 대한 좋은 점 중 하나는 나중에 버그를 유발할 수있는 실수를 막으려 고합니다. 따라서 컴파일러가 변수를 초기화 한 후에이를 사용하면 변수가 초기화됩니다. 또한 변수를 옵션으로 선언 할 수 있으므로 컴파일러에서 값이 없어도 OK이지만 그 옵션을 사용할 때마다 옵션을 언 래핑해야하므로이 방법이 더 간단합니다. – Paulw11

1

당신은 진정한 동안도 단지 반복을 사용하고 조건이 충족되는 경우에만 색상을 반환 할 수 있습니다.

참고 :

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 
+0

진술이 사실인지 확인하는 것은 무엇입니까? – Mick

+0

무한 루프입니다. 그것은 항상 사실 일 것입니다.그것은 귀하의 조건을 입력하고 색상을 반환 때만 종료됩니다 –

+0

죄송합니다, 메신저 아직도 코드하는 방법을 배우는 초기 단계에 있습니다. 그러면 내가 어떻게 거짓으로 만들고 루프를 빠져 나갈 수 있을까요? false로 전환하는 If 문을 넣었습니까? – Mick

관련 문제