如果使用Swift扩展将重载方法添加到Objective-C类,它似乎只调用第一个方法,在运行时产生意外行为或崩溃。 Swift类的扩展(与Objective-C相对)可以正常工作。我想确定是否有任何解决方法,并确认这是我应该向Apple报告的错误。鉴于Objective-C不支持Swift的重载方法,我可以想象将两者混合是问题的一个方法。
除了具有init函数的Objective-C类之外,获取扩展的类都是空的。 ObjClass在.h和.m文件中声明,并使用Swift桥接头导入。原始SwiftClass在代码示例中与Swift扩展一起定义:
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和object调用重载方法:
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
Swift类的Swift扩展按预期工作:
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 :(得分:7)
ObjC不支持方法重载。当您扩展ObjC类时,代码的接口是ObjC运行时 - 即使您从其他Swift代码中调用该类中的Swift代码 - 所以您的类'界面不能使用Swift的功能,这些功能也不存在于ObjC中。
正如您所指出的,这应该是编译错误。我推荐filing a bug about that,特别是因为您已经整理了一个方便的测试用例。