swift - 比较两个 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
协议。
解决方案
尝试使用===
而不是==
UIColor(light: .white, dark: .white) === UIColor(light: .white, dark: .white)
推荐阅读
- python - 如何在 vs 代码中激活虚拟环境?
- java - 如何在 PostGIS 中的两点(A 点和 B 点)之间获取点(纬度和经度)?
- javascript - 匹配 navigator.userAgent 中的特定字符串并从对象数组中获取详细信息
- java - 如果我在使用 Ehcache 时没有在 XML 中定义缓存会发生什么?
- php - 尝试使用 pluck 方法在选择中显示数据 - Laravel
- cytoscape.js - Cytoscape.js 将多个边缘组合成一个(更厚的)边缘
- outlook - 如何区分图 API 中发送和接收的消息?
- node.js - 是否可以将环境变量从 Elastic Beanstalk 控制台传递到 React 应用程序?
- javascript - VUE 3 停用时强制卸载
- c# - 更改 WSDL 生成界面中的 url