OC与Swift混编时获取swift类名的坑

3,062 阅读1分钟

在OC类中引入swift类,获取swift类的对象的class方法返回的是什么? 如果swift类继承自OC的类,返回的又是什么?

class Dog: NSObject {
}
class Child: Person {
}
@interface Person : NSObject
@end

以上三个类中,Dog是swift类,Person是OC类,Child是继承Person的子类 在OC环境下通过lldb调试获取到类名如下:

可以看出如果在OC类中引用swift类,swift的类名包含了个OCClass.的前缀,其中OCClass是工程名,也就是说类名是:工程名.类的声明的名称

所以在OC中使用NSClassFromString方法调用swift类的声明的名称返回的是nil

如果在swift类中引入OC的类返回的是什么,引入swift的类返回的又是什么,如果是swift类不继承NSObject呢

class Teacher {
}

Teacher是一个无父类的swift类,只能在swift类环境中使用,通过lldb,如下图所示:

可以看出,和上面在,Dog、Person、Child这三个与在OC类环境中返回的类名一样,但Teacher却不同,返回类名是不带项目工程名前缀的, 由此可得出结论:

  • 如果swift类继承自NSObject的类及其子类,返回的类名:项目工程名.声明的名称
  • 如果swift类未继承NSObject,返回的是类名是:声明的名称
  • OC类不管在swift还是OC环境中,返回的类名始终是:声明的名称