2015-10-15 67 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,所以我不明白 –