CoreData存储的颜色取出后与原颜色不相等的问题排查
问题原因及解决方法
你遇到的问题核心在于SwiftUI系统颜色(比如Color.blue)和通过UIColor归档/解档得到的Color,底层表示逻辑不一样,导致直接用==比较时返回false,哪怕视觉上完全一致。
具体来说:
- 系统预定义的
Color.blue是基于系统颜色空间的标识性颜色,内部存储的是颜色的"名称"或系统引用; - 你通过
UIColor(color)转换后归档,再解档转回Color时,得到的是基于RGBA数值的颜色,两者底层的存储结构不同,==比较自然不相等。
而且UIColor的归档/解档过程还可能引入颜色空间转换的细微误差,进一步导致比较失败。
正确的实现方式:存储颜色的RGBA数值
放弃归档UIColor的方案,直接存储颜色的红、绿、蓝、透明度四个数值,这是最可靠的方式:
1. 修改Core Data实体
给你的实体添加四个Double类型的属性:red、green、blue、alpha(默认值可以设为0,alpha设为1)。
2. 设置颜色的代码
// 先把SwiftUI Color转成UIColor,提取RGBA值 let uiColor = UIColor(color) var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0 uiColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha) // 存储到Core Data对象 habit.red = Double(red) habit.green = Double(green) habit.blue = Double(blue) habit.alpha = Double(alpha)
3. 获取颜色的代码
func getColor() -> Color { return Color( red: red, green: green, blue: blue, opacity: alpha ) }
这样存储的是精确的颜色数值,取出来的Color和原始的Color.blue(只要RGBA数值一致)用==比较就会返回true,而且避免了归档/解档带来的额外问题。
内容的提问来源于stack exchange,提问作者Kex
相关产品推荐
相关产品推荐

