无法将目标 C 代码段翻译成 Swift

Posted

技术标签:

【中文标题】无法将目标 C 代码段翻译成 Swift【英文标题】:Can't translate objective C snippet to Swift 【发布时间】:2015-10-15 16:19:40 【问题描述】:

我是 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"))
    

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

【问题讨论】:

为什么不使用this solution? @rmaddy 为什么会更好? 我推荐它是因为它已经有工作的 Swift 代码。 它会不那么糟糕,因为它不是完全可怕的、糟糕的代码。它仍然存在一些问题,并且可能会在未来的 iOS 9 更新中中断,因此“更好”并不是一个很好的思考方式。 @TomHarrington 我测试了这个解决方案,它似乎可以在 iOS 9 中使用,但是我很想知道为什么它更好 【参考方案1】:

最简单的解决方案是更新到 Xcode 7 和 Swift 2.0,performSelector:确实存在

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

【讨论】:

我的 XCode 似乎是 7.0,但我什至不知道我正在使用的 Swift 版本。我能说的是我的 IDE 自动完成“performSelector”,但我真的不知道如何使用它。请记住,我是一个完全的菜鸟,仅从 1 天开始就开始为 iOS 开发 :) 我真的在寻找最快的解决方案,因为我正在制作原型。 我真的不在乎你是什么,也不在乎你为 iOS 开发了多久。如果您的意思是“请为我编写代码,现在,我很着急”,您将不得不希望我以外的其他人为您这样做。在我看来,这不是对 Stack Overflow 的正确使用。 可以说大多数初学者的问题都不是正确使用 *** 的问题,其中大部分问题可以通过投入大量时间阅读语言规范并获得经验来回答。我认为很明显我的问题属于此类。但我理解你的意思,你会注意到我已经提供了我成功转置的内容,但我只是错过了最后一点:'( “可以说大多数初学者的问题都没有正确使用 ***” 这不是我说的。我回答了这个问题作为一个初学者问题。您的初学者问题是:“我真的不知道如何翻译 performSelector 部分,因为它似乎不在 Swift 中。”我解释说它在 Swift 中,而且你也可以不用它。这很多有用的信息可供您继续使用,而且比您以前知道的要多得多。【参考方案2】:

您只需在该方法中提供一个简单的字符串,如下所示:

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

【讨论】:

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

以上是关于无法将目标 C 代码段翻译成 Swift的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 中的 Objective C 代码

如何在 SWIFT(不是 Objective C)中设置 CGPDFOperatorTableSetCallback [关闭]

在ARM汇编编程中如何指定某段程序的存储地址

求高手将这段汇编代码转换成C

将 UIView 动画 Swift 代码翻译成 Objective-C

c语言 系统是怎么知道一段内存的长度的?