如果使用
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") } }
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)
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。