当我使用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
。
尝试使用===
代替==
UIColor(light: .white, dark: .white) === UIColor(light: .white, dark: .white)