2015-10-15 79 views
0

我是ObjectiveC和Swift的初学者(但必须为Cordova应用程序开发iOS共享扩展)。无法将目标C代码片段转换为Swift

我想在我的份额扩展

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]; 
} 

实现这个code snippet现在我有以下的,但我真的不知道如何将“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

为什么不使用[此解决方案(http://stackoverflow.com/a/28037297/1226963)? – rmaddy

+0

@rmaddy为什么它会更好? –

+0

我建议它,因为它已经有工作的Swift代码。 – rmaddy

回答

1

最简单的解决方案是更新到Xcode 7和Swift 2.0,其中performSelector:确实存在。但是,我发现在几乎所有使用Objective-C代码的情况下,我都不需要Swift,因为在Swift中,函数是一流的公民,可以作为一个值存储并在稍后检索并调用。一般来说,不应该使用performSelector:所暗示的动态 - 在Objective-C中,它经常被用作避免必须知道方法接收器的实际类别的拐杖。

+0

我的XCode似乎是7.0,但我甚至不知道我正在使用的Swift版本。我能说的是,我的IDE自动完成“performSelector”,但我真的不知道如何使用它。请记住,我是一个完全noob,只为1天开发的iOS :)我真的正在寻找最快的解决方案,因为我正在进行原型设计。 –

+0

我并不在乎你是什么或者你为iOS开发多长时间。如果你的意思是“请写我的代码给我,现在我很着急”,那么你必须希望除了我之外的其他人为你做这件事。在我看来,这不适合使用Stack Overflow。 – matt

+0

可以说大多数初学者的问题都不是正确使用StackOverflow,他们中的大多数可以通过投入大量时间阅读语言规范和获得经验来回答。我认为很明显,我的问题是这样的。但我理解你的观点,你会注意到我已经提供了我已经成功换位的东西,但我只是想念最后一点:'( –

1

你只是提供一个简单的字符串到像这样的方法:

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

我不知道为什么,但它说我无法在AnyObject上调用performSelector(但实际上clazz是一个AnyClass,所以我不明白 –