Color Literal提供的颜色与UIColor init不同(我无法比较它们)

问题描述 投票:0回答:1

我正在代码库中以两种方式创建颜色:使用颜色文字和UIColor(red:green:blue:)初始化程序。这些颜色看起来相同,但是当我尝试比较它们时,它们的成分略有不同。

具有一个方便的接受整数而不是浮点数的初始化,我有一个扩展名:

extension UIColor {

    convenience init(red: Int, green: Int, blue: Int) {
        self.init(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: 1.0)
    }
}

当我尝试测试颜色是否相同时,我的测试失败:

func testColorComparision() {
    let literalColor = #colorLiteral(red: 1, green: 0.5764705882, blue: 0, alpha: 1) // This was a picked-up color "tangerine" rgb(255,147,0)
    let rgbColor = UIColor(red: 255, green: 147, blue: 0)
    XCTAssertEqual(literalColor, rgbColor) // Colors are not the same!
}
swift uicolor
1个回答
0
投票

事实证明我的扩展代码有误。 UIColor(red:green:blue:)接受CGFloat,但这些CGFloat应为64位时代之前的数字。 CGFloat在32位体系结构中以flo​​at表示,但在64位体系结构中以double表示。但是,UIColors的组件是32位数字。我修改了扩展名:

extension UIColor {

    convenience init(red: Int, green: Int, blue: Int) {
        self.init(red: CGFloat(Float(red)/255.0), green: CGFloat(Float(green)/255.0), blue: CGFloat(Float(blue)/255.0), alpha: 1.0)
    }
}

测试通过了。第一个强制类型转换为浮点数,第二个强制转换为初始化程序接受的CGFloat数。

© www.soinside.com 2019 - 2024. All rights reserved.