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

Objective-C读取Swift类Int存储的枚举值得到内存地址如何解决

问题核心原因

你在OC侧错误地将Swift的Int类型(对应OC的NSInteger,64位设备下为64位长整型)强制转换为32位的int类型,发生了值截断,才会出现异常的负数或乱码值。你单独写的Demo里用long接收所以运行正常,原项目的写法存在类型不匹配问题。


修复方案

  • 第一步:OC侧接收值时统一用NSInteger类型,不要用int

    NSInteger test = varname.myNumber;
    SomeEnum myValue = (SomeEnum)test;
    

    你之前用int接收会截断64位的整数值,导致数值异常。而po命令是运行时动态读取完整属性值,不会做静态截断,所以打印结果是正常的。
    你之前尝试用NSNumber接收时看到的是对象指针地址,需要调用integerValue才能拿到实际数值:NSInteger realValue = [test3 integerValue];

  • 第二步:检查Swift侧存储属性的合法性
    你贴的原Swift代码中myNumber只有声明没有初始化值,也没有实现对应的构造器,这在Swift语法中是不合法的。请确认你的实际代码中myNumber有正确的默认值,或者你在构造器中完成了赋值,避免属性值为未定义的垃圾值。

  • 第三步:(可选)更稳妥的枚举存储方案
    你可以直接把Swift类的属性类型定义为枚举本身,不需要转成Int存储,OC侧可以直接识别这个枚举类型,避免手动转换的错误:

    @objcMembers
    public class MyClass: SuperClass {
        public var myEnum: SomeEnum = .apple
    }
    

    OC侧直接取值即可:

    SomeEnum value = varname.myEnum;
    
  • 第四步:清理缓存
    如果修改后还是有问题,删除Xcode的DerivedData缓存,重新编译项目,避免混编桥接文件缓存导致的类型映射错误。


内容的提问来源于stack exchange,提问作者Adriano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 14:48:04