Ios Swift单元测试-我如何断言CGColor是它的';应该是什么?

Ios Swift单元测试-我如何断言CGColor是它的';应该是什么?,ios,swift,unit-testing,Ios,Swift,Unit Testing,使用Xcode V7.2。尝试进行单元测试时,需要验证是否设置了正确的颜色,并收到以下消息: Cannot invoke 'XCTAssertEqual' with an argument list of type '(CGColor, CGColor)' 如何断言CGColor是它应该是什么?使用xctasert并测试CGColorEqualToColor是否为真 从Swift 3.0/Xcode 8.0 CGColorEqualToColor也不再工作,它会导致错误“CGColorEqua

使用Xcode V7.2。尝试进行单元测试时,需要验证是否设置了正确的颜色,并收到以下消息:

Cannot invoke 'XCTAssertEqual' with an argument list of type '(CGColor, CGColor)'

如何断言CGColor是它应该是什么?

使用
xctasert
并测试
CGColorEqualToColor
是否为真

从Swift 3.0/Xcode 8.0 CGColorEqualToColor也不再工作,它会导致错误“CGColorEqualToColor不可用:改用==”

==或isEqual具有以下限制:

比较不同型号/空间中的颜色时将返回否[/False](例如#FFF与[UIColor whiteColor])

(来自)可能不是期望的行为

这很麻烦,但我将颜色分解为R/G/B/Alpha组件,并比较它们,例如:

    var red1:CGFloat=0, green1:CGFloat=0, blue1:CGFloat=0, alpha1:CGFloat=0
    colour1.getRed(&red1, green:&green1, blue:&blue1, alpha:&alpha1)

    var red2:CGFloat=0, green2:CGFloat=0, blue2:CGFloat=0, alpha2:CGFloat=0
    colour2.getRed(&red2, green:&green2, blue:&blue2, alpha:&alpha2)

    XCTAssertEqual(red1, red2)
    XCTAssertEqual(green1, green2)
    XCTAssertEqual(blue1, blue2)
    XCTAssertEqual(alpha1, alpha2)
编辑:(将其添加到您的答案中,而不是创建新答案:)

以下是更易于使用的UIColor扩展:

import UIKit

extension UIColor {
    func isEqualTo(_ color: UIColor) -> Bool {
        var red1: CGFloat = 0, green1: CGFloat = 0, blue1: CGFloat = 0, alpha1: CGFloat = 0
        getRed(&red1, green:&green1, blue:&blue1, alpha:&alpha1)

        var red2: CGFloat = 0, green2: CGFloat = 0, blue2: CGFloat = 0, alpha2: CGFloat = 0
        color.getRed(&red2, green:&green2, blue:&blue2, alpha:&alpha2)

        return red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2
    }
}
然后像这样使用它:

XCTAssertTrue(cell.backgroundColor!.isEqualTo(.clear))
XCTAssertTrue(cell.backgroundColor == UIColor.clear)
或者-您可以使用可均衡函数

func ==(lhs: UIColor, rhs: UIColor) -> Bool {
    var lr: CGFloat = 0, lg: CGFloat = 0, lb: CGFloat = 0, la: CGFloat = 0
    lhs.getRed(&lr, green:&lg, blue:&lb, alpha:&la)
    var rr: CGFloat = 0, rg: CGFloat = 0, rb: CGFloat = 0, ra: CGFloat = 0
    rhs.getRed(&rr, green: &rg, blue: &rb, alpha: &ra)
    return lr == rr && lg == rg && lb == rb && la == ra
}
然后像这样使用它:

XCTAssertTrue(cell.backgroundColor!.isEqualTo(.clear))
XCTAssertTrue(cell.backgroundColor == UIColor.clear)

从Swift 3.0/Xcode 8.0开始,此功能不再有效。它会导致错误“CGColorEqualToColor不可用:改用==”。但是==/isEqual并不总是像中所解释的那样工作。我又回到了用getRed(551;,绿色,蓝色,alpha)来分解它,并比较各个组件,@AliBeadle这是重要的信息。你能单独回答这个问题吗?我很乐意投赞成票。(当然,有人可能会说,
==
确实“有效”,而且它不适用于不同的颜色空间这一事实是正确的。)我会同意的。关于==的好观点,将在张贴的答案中进行修改。很好!!谢谢它帮助了我!!我会小心使用浮点数上的等式,这就是它们真正的含义。根据创建颜色的方式,浮点舍入/截断可能会产生差异。