2014-12-30 92 views
5

如果使用Swift擴展將重載方法添加到Objective-C類,它似乎只調用第一個方法,從而在運行時產生意外的行爲或崩潰。 Swift類的擴展(與Objective-C相反)可以正常工作。我想確定是否有任何解決方法,並確認這是我應該向Apple報告的錯誤。鑑於Objective-C在Swift中不支持重載方法,我可以想象將這兩者混合是一個問題的處方。Swift Extension無法將重載方法添加到Objective-C類

獲取擴展的類除了具有init函數的Objective-C類外都是空的。 ObjClass在.h和.m文件中聲明並使用Swift橋接頭導入。原始SwiftClass與夫特擴展沿代碼示例中定義:

extension ObjClass { 
    func log(param: Int32) { NSLog("ObjClass->Int32: " + String(param)) } 
    func log(param: String) { NSLog("ObjClass->String: " + param) } 
    func log(param: ObjClass) { NSLog("ObjClass->ObjClass") } 
} 

class SwiftClass { 
} 

extension SwiftClass { 
    func log(param: Int32) { NSLog("SwiftClass->Int32: " + String(param)) } 
    func log(param: String) { NSLog("SwiftClass->String: " + param) } 
    func log(param: ObjClass) { NSLog("SwiftClass->ObjClass") } 
} 

現在請用字符串,int和對象重載方法:

var objClass = ObjClass() 
objClass.log(10) 
objClass.log("string") 
objClass.log(objClass) 

var swiftClass = SwiftClass() 
swiftClass.log(10) 
swiftClass.log("string") 
swiftClass.log(objClass) 

對於ObjClass,所有的方法調用對Int32類型的第一個方法進行了編程。通過使用COpaquePointer,我可以看出這與對象指針有關,但稍有不同。

ObjClass->Int32: 10 
ObjClass->Int32: 1881422800 
ObjClass->Int32: 1879122512 

斯威夫特在斯威夫特類擴展按預期工作:

SwiftClass->Int32: 10 
SwiftClass->String: string 
SwiftClass->ObjClass 

希望這可以在某種程度上支持。在此之前,我認爲它應該在編譯時失敗,而不是給出意外的行爲或崩潰。有沒有人有解決方法來建議這個?

我知道它調用了第一種方法,如果我換了ObjClass擴展方法,像這樣:

extension ObjClass { 
    func log(param: String) { NSLog("ObjClass->String: " + param) } 
    func log(param: Int32) { NSLog("ObjClass->Int32: " + String(param)) } 
    func log(param: ObjClass) { NSLog("ObjClass->ObjClass") } 
} 

然後調用objClass.log(str)工作正常,但調用objClass.log(10)生產:

main(1): EXC_BAD_ACCESS (code=1, address=0xa) 
+0

我向Apple報告了這一情況,並在Xcode中修復了這個問題 – brunobowden

回答

7

ObjC不支持方法重載。當你擴展一個ObjC類時,你的代碼的接口就是ObjC運行時 - 即使你從其他Swift代碼中調用了你的Swift代碼 - 所以你的類的接口不能使用Swift的不也出現在ObjC中。

正如你所說,這應該可能是一個編譯錯誤。我建議使用filing a bug about that,尤其是因爲你已經組裝了一個方便的測試用例。

+0

我報告了錯誤並通過電子郵件發送了Chris Lattner。我知道Objective-C不支持重載的消息 - 我應該在提問時提及。 – brunobowden

+0

我向Apple報告了這一情況,並在Xcode中修復了此問題 – brunobowden