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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:52:02