比较两个UIColor DynamicProvider(iOS13)返回False

问题描述 投票:1回答:1

Xcode 11 / iOS 13

当我使用UIColor(dynamicProvider:)初始化2个UIColor对象时,我不再可以使用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

swift uicolor xcode11 ios13 ios-darkmode
1个回答
0
投票

尝试使用===代替==

UIColor(light: .white, dark: .white) === UIColor(light: .white, dark: .white)
© www.soinside.com 2019 - 2024. All rights reserved.