如何让PKStroke遵循Equatable协议?求正确实现方案
PKStroke 遵循 Equatable 协议的正确实现方案
你的核心需求是找到同一个PKStroke实例进行修改,所以Equatable的实现必须基于实例身份的恒等判断,而非属性匹配,以下是具体分析和正确方案:
两种现有实现的问题分析
第一种实现(比较creationDate和path.count)
完全不可靠:不同的PKStroke实例可能恰好拥有相同的创建日期和路径点数,这会导致误判两个不同的stroke为相等,最终修改错误的对象。第二种实现(转PKStrokeReference用===)
思路正确但冗余:PKStroke本身是NSObject子类(引用类型),直接使用恒等运算符===即可判断是否为同一个实例,无需强制转换为PKStrokeReference。
正确的实现代码
extension PKStroke: Equatable { public static func ==(lhs: PKStroke, rhs: PKStroke) -> Bool { // 直接比较实例身份,确保是同一个对象 return lhs === rhs } }
关键注意事项
- 确保你存储的PKStroke实例和
canvasView.drawing.strokes数组中的是同一引用:当你从数组中取出stroke存储时,直接保存引用即可,不要创建副本。 - 若系统在某些操作(如修改绘图内容)中会生成PKStroke的副本,此时恒等比较会失效。这种情况下可以通过关联对象给每个stroke绑定唯一UUID,通过UUID来判断相等——但这是备选方案,优先使用实例身份比较。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

