在Swift中比较UIColors的问题

Car*_*oni 5 uicolor ios sprite-kit swift

我需要比较两个UIColors,但由于某种原因它总是返回false.我尝试比较使用==.isEqual(),但它们似乎都不起作用.

//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)
Run Code Online (Sandbox Code Playgroud)

randomColorController()只是一个随机化颜色并返回它的函数,因此在创建square时会调用它.

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
    }
Run Code Online (Sandbox Code Playgroud)

然后,根据我创建的方块的位置,它将检查碰撞,比较我创建的方块的颜色和我在开始时初始化的颜色.

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
            }
    }
Run Code Online (Sandbox Code Playgroud)

但是,color.isEqual(blue_color)或任何其他颜色,似乎不起作用.我已经印制Square.colorblue_color(和其他人),和它们匹配.但它总会回归false.

Den*_*Den 6

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 swift 3、4 中进行了测试


Leo*_*bus 5

您可以使用"=="或isEqual.我刚刚测试了它们,它们工作正常:

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
Run Code Online (Sandbox Code Playgroud)

我刚刚重现了这个问题,只有在提取SKSpriteNode颜色后才会发生,正如你所说的只有分数颜色.您可以解决此问题,比较颜色描述如下:

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚决定创建另一个函数来处理有问题的else语句,现在它完美地运行了.谢谢你,Leo !!! (2认同)