2017-02-02 4 views
0

Der Titel sagt so ziemlich alles.Wie bekomme ich Daten aus einer While-Schleife

Ich habe eine Funktion, die zufällige RGB-Werte generiert, die in eine Farbe konvertiert werden.

Ich möchte nur Farben innerhalb eines bestimmten Luminanzbereichs, also verwende ich eine While-Schleife, um die RGB-Werte zu erstellen, dann überprüfe die Luminanz mit der Idee, dass ich Schleife halten will, bis sie eine Farbe im Luminanzbereich erzeugt.

Mein Problem ist, dass ich nicht herausfinden kann, wie Daten, um aus der while-Schleife als Teil der Gesamtfunktion zu verwenden

Edit: die unten nicht funktioniert, die while-Schleife ist nicht Wenn Sie einen Wert für randomcolor ausgeben, gibt Xcode nur einen Fehler aus, der besagt, dass es vor der Initialisierung verwendet wird. selbst wenn ich die return-Anweisung in die for-Schleife hochsetze, erhalte ich nur einen Fehler für die allgemeine Aussage, dass ich keine UIcolor zurückgegeben habe. Was ich versuche, ist, den Farbwert aus der while-Schleife zu entfernen, damit er außerhalb der while-Schleife verwendet werden kann.

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

Die oben nicht funktioniert, der for-Schleife doesnt den Wert von zufälliger Farbe gesetzt, auch wenn i Verschieben Sie die return-Anweisung Die Gesamtfunktion löst einen Fehler aus Ich habe keine UIcolor zurückgegeben – Mick

+0

Ich weiß nicht, wie viel klarer ich sein kann, ich habe klargestellt, dass ich den Wert nicht aus der Schleife herausholen kann, was ich versuche machen. Die Fehler rühren von der Tatsache her, dass ich den Wert nicht aus der Schleife herausholen kann. Meine ursprüngliche Frage war, wie bekomme ich die Daten aus der Schleife, die immer noch die Frage ist. Sei kein Arsch, weil ich mehr Informationen hinzugefügt habe, als du gefragt hast. – Mick

Antwort

2

Ihr Problem ist, dass Sie Variablen am Anfang Ihrer Funktion deklarieren, aber nicht initialisieren. Ein Wert wird ihnen innerhalb der while Schleife zugewiesen, aber die Schleife kann Nullzeiten ausführen, was dazu führt, dass randomcolor nicht initialisiert wird, bevor Sie versuchen, es zu reservieren.

Jetzt können Sie und ich diesen Code betrachten und sehen, dass lum mit 0 initialisiert wird, so dass die while mindestens einmal ausgeführt wird, aber Swift funktioniert nicht so. Es sieht nur, dass die einzige Aufgabe innerhalb eines bedingten Blocks liegt, also wird es verärgert.

Sie können Ihren Code ein wenig vereinfachen, indem der if Anweisung loszuwerden:

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

Arbeitete wie ein Charme. Prost Kumpel, bin ich immer besser dran, den Wert auf 0 zu setzen, anstatt ihn leer zu lassen? – Mick

+0

Eines der guten Dinge an Swift ist, dass es versucht, Fehler zu verhindern, die später zu Fehlern führen können. Wenn der Compiler denkt, dass Sie eine Variable verwenden, bevor sie initialisiert wird, dann wird es Ihnen sagen. Sie könnten die Variablen auch als optionals deklariert haben, so dass der Compiler weiß, dass ein Wert nicht OK ist, aber Sie müssen das optionale jedes Mal auspacken, wenn Sie es verwendet haben, also ist dieser Weg einfacher. – Paulw11

1

Sie können einfach auch wiederholen verwenden, während wahr und geben nur die Farbe, wenn Ihre Bedingung erfüllt ist.

Hinweis: Ich habe UIColor verwendet nur den Ansatz zu verdeutlichen:

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 
    } 
} 

Nutzung:

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

Worauf überprüft es, ob die Aussage wahr ist? – Mick

+0

Es ist eine Endlosschleife. Es wird immer wahr sein.Es wird nur beendet, wenn es in Ihren Zustand eintritt und die Farbe zurückgibt. –

+0

Tut mir leid, ich bin noch in den frühen Phasen des Lernens, wie man programmiert. Wie würde ich es dann falsch machen und es zwingen, die Schleife zu verlassen. Ist es die If-Anweisung, die Sie es gesetzt haben, die es falsch schaltet? – Mick

Verwandte Themen