如果使用 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 和对象调用重载方法:
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)