首页 > 解决方案 > 比较两个 UIColor DynamicProvider (iOS13) 返回 False

问题描述

Xcode 11 / iOS 13

当我使用初始化 2 UIColor 对象时,UIColor(dynamicProvider:)我不能再使用color1 == color2了,因为(我认为)它无法比较闭包。

当您在属性中使用颜色时,此问题还会破坏 NSAttributedStrings 的比较。

例子

extension UIColor {

    // MARK: - Specify All Colors

    convenience init(light: UIColor, dark: UIColor) {

        self.init(dynamicProvider: { (traits) in
            switch traits.userInterfaceStyle {
            case .unspecified, .light: return light
            case .dark: return dark
            }
        })
    }
}

UIColor(light: .white, dark: .white) == UIColor(light: .white, dark: .white) // false

当前(非最佳解决方案)

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协议。

标签: swiftuicolorxcode11ios13ios-darkmode

解决方案


尝试使用===而不是==

UIColor(light: .white, dark: .white) === UIColor(light: .white, dark: .white)

推荐阅读