Objective-C读取Swift类Int存储的枚举值得到内存地址如何解决
问题核心原因
你在OC侧错误地将Swift的Int类型(对应OC的NSInteger,64位设备下为64位长整型)强制转换为32位的int类型,发生了值截断,才会出现异常的负数或乱码值。你单独写的Demo里用long接收所以运行正常,原项目的写法存在类型不匹配问题。
修复方案
第一步:OC侧接收值时统一用
NSInteger类型,不要用intNSInteger 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
相关产品推荐
相关产品推荐

