如何比较两个 UIDynamicProviderColor?

Eug*_*nio 6 swift ios13

我正在比较两个UIColor使用新的 iOS 13 初始化的init(dynamicProvider:)

https://developer.apple.com/documentation/uikit/uicolor/3238041-init

但这就是我在单元测试中将它们与以下内容进行比较时得到的运行时XCTAssertEqual

XCTAssertEqual failed: ("Optional(<UIDynamicProviderColor: {...}; 
provider = <__NSMallocBlock__: {...}>>)") is not equal to 
("Optional(<UIDynamicProviderColor: {...}; provider = <__NSMallocBlock__: {...}>>)")
Run Code Online (Sandbox Code Playgroud)

这是我如何创建颜色的示例:

struct Style {
    static var color: UIColor {
        if #available(iOS 13.0, *) {
                return UIColor { traitCollection in
                    return traitCollection.userInterfaceStyle == .dark ? .secondarySystemBackground : UIColor.white
                }
        } else {
            return UIColor.white
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试代码:

func testExample() {
    XCTAssertEqual(Style.color, Style.color)
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用扩展名覆盖isEqual方法,UIColor但显然它没有被调用。

你有什么解决方法吗?

Jho*_*lin 7

单元测试的一种解决方案是将代码更改为:

XCTAssertEqual(Style.color.cgColor, yourExpectedColor.cgColor)
Run Code Online (Sandbox Code Playgroud)

在运行时的 iOS 13 中,它比较两个 UIDynamicProviderColor 对象,这些对象在运行块“(UITraitCollection) -> UIColor”后返回一个 UIColor 对象。所以,这就是你有两个不同对象的原因。从两者获取 cgColor 您可以正确比较它们。我希望我有帮助。

  • 更好的解决方案是对颜色调用“resolvedColor(with:)”,并传入特征集合。这将为您提供适合特征集合指定的暗/亮模式的非动态颜色。 (2认同)