You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:35:23