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



Xcode 11/iOS 13

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

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

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

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

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

最新更新