swift 如何比较两个UID ProviderColor?

yuvru6vn  于 2024-01-05  发布在  Swift
关注(0)|答案(3)|浏览(164)

我正在比较两个使用新的iOS 13 init(dynamicProvider:)初始化的UIColor
https://developer.apple.com/documentation/uikit/uicolor/3238041-init
但这就是我在单元测试中将它们与XCTAssertEqual进行比较时得到的运行时结果:

  1. XCTAssertEqual failed: ("Optional(<UIDynamicProviderColor: {...};
  2. provider = <__NSMallocBlock__: {...}>>)") is not equal to
  3. ("Optional(<UIDynamicProviderColor: {...}; provider = <__NSMallocBlock__: {...}>>)")

字符串
这是我如何创建颜色的一个例子:

  1. struct Style {
  2. static var color: UIColor {
  3. if #available(iOS 13.0, *) {
  4. return UIColor { traitCollection in
  5. return traitCollection.userInterfaceStyle == .dark ? .secondarySystemBackground : UIColor.white
  6. }
  7. } else {
  8. return UIColor.white
  9. }
  10. }
  11. }


测试代码:

  1. func testExample() {
  2. XCTAssertEqual(Style.color, Style.color)
  3. }


我尝试用扩展覆盖UIColorisEqual方法,但显然没有调用。
你对此有什么变通办法吗?

iqjalb3h

iqjalb3h1#

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

  1. XCTAssertEqual(Style.color.cgColor, yourExpectedColor.cgColor)

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

agyaoht7

agyaoht72#

目前,我们正在做以下工作:

  1. func equals(_ object: Any?) -> Bool {
  2. guard let rhs = object as? UIColor else { return false }
  3. var lhsR: CGFloat = 0
  4. var lhsG: CGFloat = 0
  5. var lhsB: CGFloat = 0
  6. var lhsA: CGFloat = 0
  7. getRed(&lhsR, green: &lhsG, blue: &lhsB, alpha: &lhsA)
  8. var rhsR: CGFloat = 0
  9. var rhsG: CGFloat = 0
  10. var rhsB: CGFloat = 0
  11. var rhsA: CGFloat = 0
  12. rhs.getRed(&rhsR, green: &rhsG, blue: &rhsB, alpha: &rhsA)
  13. return lhsR == rhsR && lhsG == rhsG && lhsB == rhsB && lhsA == rhsA
  14. }

字符串
有了这个,你就不能再使用==了,但是当你想比较颜色的时候,你必须显式地调用这个函数。
但是一个更好的解决方案是使用resolvedColor(with:)来比较颜色的每个表示。但是这必须由Apple实现,所以我们可以继续使用==Equatable协议。

展开查看全部
q9yhzks0

q9yhzks03#

按照@adurdin的建议,你可以通过这样做来检查暗模式和亮模式的颜色:

  1. XCTAssertEqual(
  2. Style.color.resolvedColor(with: UITraitCollection(userInterfaceStyle: .dark)),
  3. .secondarySystemBackground
  4. )
  5. XCTAssertEqual(
  6. Style.color.resolvedColor(with: UITraitCollection(userInterfaceStyle: .light)),
  7. .white
  8. )

字符串

相关问题