除了具有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: 10ObjClass->Int32: 1881422800ObjClass->Int32: 1879122512
Swift类上的Swift扩展按预期工作:
SwiftClass->Int32: 10SwiftClass->String: stringSwiftClass->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)解决方法 ObjC不支持方法重载.当您扩展ObjC类时,代码的接口是ObjC运行时 – 即使您从其他Swift代码调用该类中的Swift代码 – 所以您的类的接口不能使用Swift的特性也出现在ObjC.
正如您所指出的,这可能是编译错误.我推荐filing a bug about that,特别是因为你已经组装了一个方便的测试用例.
总结以上是内存溢出为你收集整理的Swift Extension无法将重载方法添加到Objective-C类全部内容,希望文章能够帮你解决Swift Extension无法将重载方法添加到Objective-C类所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)