无法将目标C片段转换为Swift

我是ObjectiveC和Swift的初学者(但是必须为Cordova应用程序开发iOS共享扩展)。

我试图在我的共享扩展中实现这个代码片段

NSURL *destinationURL = [NSURL URLWithString:@"myapp://"]; // Get "UIApplication" class name through ASCII Character codes. NSString *className = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x55, 0x49, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E} length:13] encoding:NSASCIIStringEncoding]; if (NSClassFromString(className)) { id object = [NSClassFromString(className) performSelector:@selector(sharedApplication)]; [object performSelector:@selector(openURL:) withObject:destinationURL]; } 

现在我有以下,但我不知道如何翻译“performSelector”部分,因为它看起来不是在Swift中。

  let bytesArray : [UInt8] = [0x55, 0x49, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E] let classNameNs = NSString.init(data: NSData(bytes: bytesArray, length: bytesArray.count), encoding: NSASCIIStringEncoding) ?? "" let className = classNameNs as String NSClassFromString(className).map { clazz in let result = clazz.performSelector(Selector("sharedApplication")) } 

有人可以帮我完成这个部分吗? 谢谢

最简单的解决scheme是更新到Xcode 7和Swift 2.0,其中performSelector:存在。

然而,我发现在几乎所有的情况下,我的Objective-C代码使用performSelector:我不需要它在Swift中,因为在Swift中,函数是一等公民,可以存储为一个值,以后检索并呼吁。 一般来说, performSelector:所隐含的dynamic不应该被用在Objective-C中,因为它可以避免必须知道方法接收者的实际类。

你只需要在这个方法中提供一个简单的string:

 NSClassFromString(className).map { clazz in let result = clazz.performSelector("sharedApplication") }