如果使用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)
我向Apple報告了這一情況,並在Xcode中修復了這個問題 – brunobowden