swift 如何比较两个UID ProviderColor?

yuvru6vn  于 12个月前  发布在  Swift
关注(0)|答案(3)|浏览(120)

我正在比较两个使用新的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)
}


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

iqjalb3h

iqjalb3h1#

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

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

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

agyaoht7

agyaoht72#

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

func equals(_ object: Any?) -> Bool {
    guard let rhs = object as? UIColor else { return false }

    var lhsR: CGFloat = 0
    var lhsG: CGFloat = 0
    var lhsB: CGFloat = 0
    var lhsA: CGFloat = 0
    getRed(&lhsR, green: &lhsG, blue: &lhsB, alpha: &lhsA)

    var rhsR: CGFloat = 0
    var rhsG: CGFloat = 0
    var rhsB: CGFloat = 0
    var rhsA: CGFloat = 0
    rhs.getRed(&rhsR, green: &rhsG, blue: &rhsB, alpha: &rhsA)

    return  lhsR == rhsR && lhsG == rhsG && lhsB == rhsB && lhsA == rhsA
}

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

q9yhzks0

q9yhzks03#

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

XCTAssertEqual(
    Style.color.resolvedColor(with: UITraitCollection(userInterfaceStyle: .dark)), 
    .secondarySystemBackground
)
XCTAssertEqual(
    Style.color.resolvedColor(with: UITraitCollection(userInterfaceStyle: .light)),
    .white
)

字符串

相关问题