【问题标题】:Dynamically instanciating ObjC class in Swift (with NSClassFromString?)在 Swift 中动态实例化 ObjC 类(使用 NSClassFromString?)
【发布时间】:2020-10-29 23:48:43
【问题描述】:

我有一个带有 init 方法的 ObjC 类

-(instancetype) initWithApiKey: (NSString *) key order: (NSNumber *) order

在 ObjC 中,我使用以下代码动态创建它:

id classAllocation = [NSClassFromString(@"MyClass") alloc];
NSObject * classInstance = [classAllocation performSelector:@selector(initWithApiKey:order:) 
withObject:@"mykey" withObject:@1];

但是我如何在 Swift 中做同样的事情呢?

【问题讨论】:

  • 出于好奇——你为什么要这样做?为什么不简单地调用初始化程序?还是 rhi 只是问题的简化示例?
  • 你不能直接从 Swift 调用它吗? developer.apple.com/documentation/foundation/… 你需要展示你在 Swift 中究竟尝试了什么以及它是如何失败的。
  • 你不需要在 ObjC 中使用 performSelector,顺便说一句。您可以拨打[[NSClassFromString(@"MyClass") alloc] initWithApiKey:@"mykey" order:@1]。您可以使用来自 Swift 的空初始化程序(来自 Swift 的 let classObject = NSClassFromString("MyClass"); let classInstance = classObject.init() 动态创建对象,但不确定您是否可以通过这种方式执行任何任意 init 方法。您可能需要实现一个包装函数或类方法,然后将其桥接并从 Swift 调用.

标签: ios objective-c swift3


【解决方案1】:

试试这个:

if let allocatedObject = NSClassFromString("MyClass")?.alloc() as? NSObject {
    let selector: Selector = NSSelectorFromString("initWithApiKey:order:")
    let methodIMP: IMP! = allocatedObject.method(for: selector)
    let objectAfterInit = unsafeBitCast(methodIMP,to:(@convention(c)(AnyObject?,Selector,NSString,NSNumber)->NSObject).self)(allocatedObject,selector,"mykey", NSNumber(integerLiteral: 1))
}

我的回答here中有更多详细示例

【讨论】:

  • 我最终得到了一个类似的解决方案``` if letallocateObject = NSClassFromString("MyClass")?.alloc() as? NSObject { 让选择器:选择器 = NSSelectorFromString("initWithApiKey:order:") 让 obj = assignedObject.init() if (obj.responds(to: selector)) == true { obj.perform(selector, with:"key" , 顺序:0); } } ```
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2019-11-08
  • 2018-04-20
  • 2015-04-26
  • 1970-01-01
相关资源
最近更新 更多