如何快速比较颜色

我想要为不同的状态更改button背景。 我这样做:

@IBAction func addToShedulerAction(sender: UIButton) { println(sender.backgroundColor) if sender.backgroundColor==UIColor.redColor(){ sender.backgroundColor==UIColor.whiteColor() } else //if sender.backgroundColor==UIColor.whiteColor() { sender.backgroundColor=UIColor.redColor() } } 

但在第一次按下println时打印nil和背景变成红色,在第二次按下println时打印“可选(UIDeviceRGBColorSpace 1 0 0 1)”,颜色不变

您不使用==运算符比较颜色。 你这样做,你需要! 打开可选的颜色:

 if sender.backgroundColor!.isEqual(UIColor.redColor()) {           } 

另外,在你的赋值语句中删除多余的= 。 它应该是:

 sender.backgroundColor = UIColor.whiteColor() 

以前的答案是错误的原因

 UIColor.black.isEqual(UIColor(red: 0, green: 0, blue: 0, alpha: 1)) 

返回false

将此代码添加到您的项目(Swift 4)

 extension UIColor { static func == (l: UIColor, r: UIColor) -> Bool { var r1: CGFloat = 0 var g1: CGFloat = 0 var b1: CGFloat = 0 var a1: CGFloat = 0 l.getRed(&r1, green: &g1, blue: &b1, alpha: &a1) var r2: CGFloat = 0 var g2: CGFloat = 0 var b2: CGFloat = 0 var a2: CGFloat = 0 r.getRed(&r2, green: &g2, blue: &b2, alpha: &a2) return r1 == r2 && g1 == g2 && b1 == b2 && a1 == a2 } } func == (l: UIColor?, r: UIColor?) -> Bool { let l = l ?? .clear let r = r ?? .clear return l == r } 

所以现在

 UIColor.black == UIColor(red: 0, green: 0, blue: 0, alpha: 1) 

返回true

以及对于你:

 if sender.backgroundColor == .red { sender.backgroundColor = .white } else { sender.backgroundColor = .red } 

现在你的代码看起来很好:)

你的第一个if语句有错误。 它应该是:

 if sender.backgroundColor.isEqual(UIColor.redColor()){ sender.backgroundColor=UIColor.whiteColor // only one '=' here }