CoreData中能否使用UInt16存储0-65535范围的数据?
在CoreData中存储0-65535范围数据的方案
不需要使用Integer 32,完全可以通过自定义属性转换的方式在CoreData中实现UInt16的存储,具体操作步骤如下:
- 在CoreData实体里,将目标属性的类型设置为
Integer 16 - 创建一个遵循
NSSecureCoding的属性转换器:class UInt16Converter: ValueTransformer { override class func allowsReverseTransformation() -> Bool { return true } override class func transformedValueClass() -> AnyClass { return NSNumber.self } override func transformedValue(_ value: Any?) -> Any? { guard let uintValue = value as? UInt16 else { return nil } return NSNumber(value: uintValue) } override func reverseTransformedValue(_ value: Any?) -> Any? { guard let numberValue = value as? NSNumber else { return nil } return UInt16(numberValue.int16Value) } override class func supportsSecureCoding() -> Bool { return true } } - 打开CoreData模型编辑器,选中目标属性,在Data Model Inspector面板的Transformer选项中,填入转换器的类名
UInt16Converter - 在App启动阶段注册转换器:
ValueTransformer.setValueTransformer(UInt16Converter(), forName: NSValueTransformerName(rawValue: "UInt16Converter"))
完成上述设置后,CoreData会以Integer 16的2字节存储空间来存储UInt16类型数据,既不会浪费空间,又能完美覆盖0-65535的数值范围。
额外注意事项:
- 模型中填写的转换器类名要和代码中的类名完全一致,包括大小写
- 如果使用Codegen自动生成实体类,需要手动将对应属性的类型从默认的
Int16修改为UInt16
内容的提问来源于stack exchange,提问作者Mike Nathas
相关产品推荐
相关产品推荐

