我是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"))
}
有人可以帮我完成这部分吗?感谢
答案 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")
}