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
相关产品推荐
相关产品推荐

