使用Swift文件的NSClassFromString

时间:2015-02-24 21:24:55

标签: swift objective-c-runtime objective-c-swift-bridge

我在现有的Objective-C项目中已经在Swift中编写了一个类。到目前为止,桥接工作非常顺利。我确实有一个方法,我在运行时使用NSClassFromString()生成一个类。当字符串是我的Swift类名时,它返回nil。

class MySwiftClass : NSObject {}

并在Objective-C中:

Class myClass = NSClassFromString(@"MySwiftClass");

和myClass每次都是零。我也试过了:

Class myClass = NSClassFromString(@"MyAppName.MySwiftClass");

仍然没有。

2 个答案:

答案 0 :(得分:11)

所有swift类都使用Product Module Name一个点和它们的命名空间的类名(Module.Class)。如果你想使用" MySwiftClass" Objective-C代码中类的名称;你可以添加@objc(MySwiftClass)注释来公开相同的swift类名(没有模块):

@objc(MySwiftClass)
class MySwiftClass{
    ...
}

然后

Class myClass = NSClassFromString(@"MySwiftClass");

将包含该类而不是nil。

答案 1 :(得分:0)

一种兼容Objective-C和Swift的方法:

CQBaseViewController *detailVC = [[NSClassFromString(controller_name) alloc] init];

// if nil,check as Swift file
if (!detailVC) {
    NSString *prefix = [[NSBundle mainBundle] infoDictionary][@"CFBundleExecutable"];
    NSString *swiftClassName = [NSString stringWithFormat:@"%@.%@", prefix, controller_name];
    detailVC = [[NSClassFromString(swiftClassName) alloc] init];
}