2015-06-05 8 views
5

Ich muss zwei UIColors vergleichen, aber aus irgendeinem Grund gibt es immer false zurück. Ich habe versucht zu vergleichen mit == und .isEqual(), aber keiner von ihnen scheint zu funktionieren.Problem beim Vergleichen von UIColors in Swift

//This is a sample of the colors I have created 
let blue_color = UIColor(red: 122/255, green: 180/255, blue: 190/255, alpha: 1) 


//This is the SpriteNode I have to compare 

let square = SKSpriteNode(color: randomColorController(), size: ksquaresize) 

randomColorController() ist nur eine Funktion, die Farben und gibt es, so es wird aufgerufen, wenn Platz geschaffen wird randomisiert.

func randomColorController() -> UIColor { 
    let random = arc4random_uniform(3) + 1 

    switch random { 
    case 1: 
     let color = blue_color 
     return color 
    case 2: 
     let color = yellow_color 
     return color 
    case 3: 
     let color = yellow_color 
     return color 
    default: 
     let color = UIColor.clearColor() 
     return color 
    } 

Dann, abhängig von der Position des Platzes ich geschaffen habe, wird es Kollision überprüfen Sie die Farbe des Quadrates zu vergleichen ich geschaffen habe und die Farben, die ich am Anfang initialisiert.

func checkCollision(currentTime: CFTimeInterval, Square: SKSpriteNode) -> Int{ 
    let color = Square.color 

    print(color.isEqual(blue_color)) 
    print(color.isEqual(red_color)) 
    print(color.isEqual(yellow_color)) 

    if Square.position.y >= 0 && Square.position.y <= 40 { 
     if color.isEqual(blue_color) && (Square.position.x < basesize.width) { 
       // ADDS 1 POINT TO THE SCORE LABEL 
       flag = 1 
       points += 1 
      } else if color.isEqual(red_color) && (Square.position.x > (basesize.width*2)){ 
       flag = 1 
       points += 1 
      } else if color.isEqual(yellow_color) && (Square.position.x < (basesize.width*2)) && (Square.position.x > basesize.width) { 
       flag = 1 
       points += 1 
      } else { 
       flag = -1 
      } 
    } 

Aber color.isEqual(blue_color) oder eine der anderen Farben, scheint nicht zu funktionieren. Ich habe Square.color und blue_color (und die anderen) gedruckt, und sie stimmen überein. Aber es würde immer false zurückgeben.

+0

Sie müssen sicherstellen, dass die Farben in der gleichen Farbraum/Modell sind . Wenn sie nicht sind, werden sie nicht gleich sein. Versuchen Sie zuerst, die Farben zu konvertieren, um sicherzustellen, dass sie sich im selben Farbraum befinden. – rmp

+0

Was meinst du damit Farben konvertieren? Wenn sie in der gleichen Klasse sind, sind sie nicht in demselben Raum? Und da ich die selbe Variable verwende, um die Farben einzustellen und später zu vergleichen, sind sie nicht die gleichen? –

+0

Hat Swift das gleiche Problem mit der Ganzzahldivision, die Objective-C hat? Mit anderen Worten - gibt '122/255'' 0' oder die gewünschte '0.47843'? – rmaddy

Antwort

5

Sie können "==" oder isEqual verwenden. Ich habe gerade beide getestet und sie funktionieren gut:

let redColor = UIColor.redColor() 
let greenColor = UIColor.greenColor() 
let blueColor = UIColor.blueColor() 

let testColor = UIColor.greenColor() 


println(testColor == redColor) // false 
println(testColor == greenColor) // true 
println(testColor == blueColor) // false 

println(testColor.isEqual(redColor)) // false 
println(testColor.isEqual(greenColor)) // true 
println(testColor.isEqual(blueColor)) // false 

Ich habe gerade reproduziert nur das Problem tritt auf, nachdem die SKSpriteNode Farbe extrahieren und wie Sie gesagt nur mit Bruch Farben. Sie können Ihren Weg, um dieses Problem Vergleich der Farbbeschreibung wie folgt funktionieren:

let blue_color = UIColor(red: 122/255, green: 180/255, blue: 190/255, alpha: 1) 
let yellow_color = UIColor(red: 253/255, green: 213/255, blue: 123/255, alpha: 1) 
let red_color = UIColor(red: 238/255, green: 116/255, blue: 71/255, alpha: 1) 

func randomColorController() -> UIColor { 
    let random = arc4random_uniform(3) + 1 

    switch random { 
    case 1: 
     return blue_color 
    case 2: 
     return red_color 
    case 3: 
     return yellow_color 
    default: 
     return UIColor.clearColor() 
    } 
} 



let square = SKSpriteNode(color: randomColorController(), size: CGSize(width: 30, height: 30)) 

if square.color.description == blue_color.description { 
    println(true) 
} 
if square.color.description == red_color.description { 
    println(true) 
} 
if square.color.description == yellow_color.description { 
    println(true) 
} 
+0

Ich habe mit eingebauten Farben begonnen, und es hat perfekt funktioniert. Aber dann wollte ich zu benutzerdefinierten Farben wechseln, und dann begann das Problem. –

+0

Ich habe nur reproduziert das Problem passiert nur nach dem Extrahieren der Farbe SKSpriteNode und wie Sie nur mit Bruchfarben gesagt haben –

+0

Haben Sie irgendwelche Ideen, wie Sie es beheben, Leo? –

4
extension UIColor { 
    func isEqual(color: UIColor?) -> Bool { 
     guard let color = color else { return false } 

     var red:CGFloat = 0 
     var green:CGFloat = 0 
     var blue:CGFloat = 0 
     var alpha:CGFloat = 0 
     self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) 

     var targetRed:CGFloat = 0 
     var targetGreen:CGFloat = 0 
     var targetBlue:CGFloat = 0 
     var targetAlpha:CGFloat = 0 
     color.getRed(&targetRed, green: &targetGreen, blue: &targetBlue, alpha: &targetAlpha) 

     return (Int(red*255.0) == Int(targetRed*255.0) && Int(green*255.0) == Int(targetGreen*255.0) && Int(blue*255.0) == Int(targetBlue*255.0) && alpha == targetAlpha) 
    } 
} 

ich in schnellen 3 getestet, 4

Verwandte Themen