我正在比较两个使用新的iOS 13 init(dynamicProvider:)
初始化的UIColor
https://developer.apple.com/documentation/uikit/uicolor/3238041-init
但这就是我在单元测试中将它们与XCTAssertEqual
进行比较时得到的运行时结果:
XCTAssertEqual failed: ("Optional(<UIDynamicProviderColor: {...};
provider = <__NSMallocBlock__: {...}>>)") is not equal to
("Optional(<UIDynamicProviderColor: {...}; provider = <__NSMallocBlock__: {...}>>)")
字符串
这是我如何创建颜色的一个例子:
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
}
}
}
型
测试代码:
func testExample() {
XCTAssertEqual(Style.color, Style.color)
}
型
我尝试用扩展覆盖UIColor
的isEqual
方法,但显然没有调用。
你对此有什么变通办法吗?
3条答案
按热度按时间iqjalb3h1#
单元测试的一个解决方案是将代码改为:
字符串
在iOS 13运行时,它会比较两个UIDericProviderColor对象,在运行块“(UITraitCollection)-> UIColor”后返回UIColor对象。所以,这就是你有两个不同对象的原因。从两者中获取cgColor,你可以正确地比较它们。我希望我能有所帮助。
agyaoht72#
目前,我们正在做以下工作:
字符串
有了这个,你就不能再使用
==
了,但是当你想比较颜色的时候,你必须显式地调用这个函数。但是一个更好的解决方案是使用
resolvedColor(with:)
来比较颜色的每个表示。但是这必须由Apple实现,所以我们可以继续使用==
和Equatable
协议。q9yhzks03#
按照@adurdin的建议,你可以通过这样做来检查暗模式和亮模式的颜色:
字符串