2017-01-23 79 views
2

我想动态加载一个使用objc运行时从NSObject继承的Swift类。 (我试图加载的类从ObjC,而不是斯威夫特)objc_getClass:加载swift类继承NSObject

我的雨燕类:

@objc public class TestClass : NSObject { 

    @objc public func testMethod() -> String { 
     return "String" 
    } 

} 

根据苹果的文档,

@objc属性让你的雨燕提供的API Objective-C和Objective-C运行时间

但是objc_getClass("TestClass")的结果是(null)

我做错了什么?或者根本不可能使用objc运行时加载继承ObjC类的swift类?

回答

3

您需要为您的类指定一个Objective-C名称中使用幕后的确切名称,而不是仅仅包括@objc

@objc(TestClass) public class TestClass : NSObject { 

    @objc public func testMethod() -> String { 
     return "String" 
    } 

} 

NSClassFromString("TestClass") // TestClass.Type 

objc_getClass("TestClass") // TestClass 

否则你的类不会用Objective-C运行时注册,并且像objc_getClassNSClassFromString这样的调用将返回nil

+1

实际上,如果你执行'print(TestClass.className())'(没有指定Objective-C名字),它会输出“objc_class_name.TestClass” - 你可以使用'objc_getClass'。所以它在运行时注册,它只有一个前缀名。 – Hamish

+0

@Hamish ooh我不知道。谢谢!我会编辑我的答案。 – JAL

+0

@Hamish Hmm,'TestClass.className()'不为我编译(Swift 3)。 – JAL

2

如果您尝试objc_getClass("YourAppName.TestClass")会怎么样?很可能模块名称是前置的。您可以验证这是通过使用NSStringFromClass([TestClass class])

+3

在这种特殊情况下,命名空间冲突并不是问题,但是很好的猜测。 – JAL