5

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

class MySwiftClass : NSObject {}

在 Objective-C 中:

Class myClass = NSClassFromString(@"MySwiftClass");

并且 myClass 每次都为零。我也试过:

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

仍然为零。

4

2 回答 2

15

所有 swift 类都使用产品模块名称一个点和名称空间的类名(Module.Class)。如果您想在 Objective-C 代码中为类使用“MySwiftClass”名称;您可以添加@objc(MySwiftClass)注释以公开相同的 swift 类名(不带模块):

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

然后

Class myClass = NSClassFromString(@"MySwiftClass");

将包含类而不是 nil。

于 2015-06-17T14:51:15.040 回答
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];
}
于 2019-05-28T15:29:34.363 回答