【问题标题】:NSClassFromString using a Swift FileNSClassFromString 使用 Swift 文件
【发布时间】:2015-04-26 17:07:58
【问题描述】:

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

class MySwiftClass : NSObject {}

在 Objective-C 中:

Class myClass = NSClassFromString(@"MySwiftClass");

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

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

仍然为零。

【问题讨论】:

  • 您是否尝试过另辟蹊径,看看 NSStringFromClass 对 MySwiftClass 有什么看法?
  • @CodaFi NSStringFromClass 工作。

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


【解决方案1】:

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

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

然后

Class myClass = NSClassFromString(@"MySwiftClass");

将包含类而不是 nil。

【讨论】:

  • 这在我的项目中由于某种原因不起作用,有什么想法吗?
【解决方案2】:

一种兼容 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];
}

【讨论】:

    猜你喜欢
    • 2014-07-24
    • 1970-01-01
    • 2020-10-29
    • 2018-04-20
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多