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

Core Data中Set<CustomObject>属性的安全编码解码实现疑问

解决Core Data中Set的安全解码问题

这个问题我之前处理过,核心原因是Set<CustomObject>本身并不是NSObject的子类,所以编译器没办法匹配到你期望的泛型decodeObject(of:forKey:)方法,转而调用了接受类型数组的重载版本。下面是具体的解决方案:

前提准备

确保你的CustomObject类也已经正确遵循NSSecureCoding协议,实现了supportsSecureCoding属性、init(coder:)和encode(with:)方法——毕竟集合里的元素也得支持安全编码才行。

修改解码逻辑

我们需要先把集合解码成NSSet(它是NSObject子类,支持安全解码),再转换成Swift的Set<CustomObject>。具体代码如下:

public required convenience init?(coder aDecoder: NSCoder) {
    self.init()
    
    // 安全解码xxx属性:先解码为NSSet,指定元素类型为CustomObject
    if let nsSet = aDecoder.decodeObject(of: [NSSet.self, CustomObject.self], forKey: "xxx") as? NSSet {
        self.xxx = Set(nsSet as! Set<CustomObject>)
    } else {
        self.xxx = [] // 或者根据需求处理空值情况
    }
    
    // 其他属性的安全解码...
}

对应的编码方法也要改成安全版本:

public func encode(with aCoder: NSCoder) {
    // 把Swift Set转成NSSet再编码
    aCoder.encode(NSSet(set: xxx), forKey: "xxx")
    
    // 其他属性的编码...
}

验证Core Data配置

别忘了确认你的xcdatamodeld文件中,xxx属性的设置:

  • 类型为Transformable
  • 勾选“Optional”(如果需要的话)
  • 转换器选择NSSecureUnarchiveFromData(不要用默认的无转换器选项)

这样修改后,就能实现Set<CustomObject>的安全编码和解码,同时符合Apple的安全规范啦。

内容的提问来源于stack exchange,提问作者Reinhard Männer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:04:21