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

时间:2015-10-15 16:19:40

标签: ios objective-c swift

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

我正在尝试在我的共享扩展程序中实现此code snippet

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"))
    }

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

2 个答案:

答案 0 :(得分:1)

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

但是,我发现在我的Objective-C代码使用performSelector:的几乎所有情况下,我在Swift中都不需要它,因为在Swift中,函数是一等公民并且可以存储作为一个值,后来检索和调用。一般来说,performSelector:暗示的动态不应该使用 - 因为在Objective-C中经常使用它作为避免必须知道方法接收者的实际类的拐杖。

答案 1 :(得分:1)

你必须在这个方法中提供一个简单的字符串,如下所示:

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