2017-02-02 10 views
0

タイトルはかなりすべてです。whileループからデータを取得する方法

私は色に変換されるランダムな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 
} 
+0

上記doesntの仕事、ランダムな色の値を設定するforループdoesntの、偶数I場合return文を動かすと、全体的な関数がエラーをスローしてUIcolorを返したことを知らせてくれます。 – Mick

+0

私はどれくらい明確にわかりますか、明確に私が試しているループの価値を得ることはできないと明言しましたする。エラーはすべて私がループから値を得ることができないという事実に由来します。私の元の質問は、どのように私はまだ質問のループからデータを取得することでした。あなたが尋ねたような情報を追加したので、お尻にしないでください。 – Mick

答えて

2

問題は、関数の開始時に変数を宣言していて、初期化していないということです。 whileループ内で値が割り当てられますが、ループがゼロ回実行されるため、予約しようとする前にrandomcolorが初期化されません。

lumは0で初期化されていますので、whileは少なくとも1回は実行されますが、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の良い点の1つは、後でバグが発生する可能性のある間違いを防ぐことです。コンパイラが変数を使用して初期化される前に変数を使用していると判断した場合は、また、変数をオプションとして宣言して、値を持たないことがOKであることをコンパイラが認識できるようにすることもできますが、オプションを使用するたびにオプションをアンラップする必要があります。 – Paulw11

1

あなたの条件が満たされた場合にのみ真とは色を返しながら、あなたはまた、単に繰り返しを使用することができます。

注:私はちょうどアプローチを説明するために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 
+0

この文が真であるかどうかを確認するにはどうすればよいですか? – Mick

+0

これは無限ループです。それは常に真実です。それはあなたの状態に入って、色を返すときにだけ終了します –

+0

申し訳ありませんが、私はまだコーディング方法を学ぶの初期段階にあります。だから私はどのようにそれを偽にし、ループから出るように強制しますか?あなたはそれをfalseにするスイッチを置いたIfステートメントですか? – Mick

関連する問題