加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift Extension无法将重载方法添加到Objective-C类

发布时间:2020-12-14 04:43:49 所属栏目:百科 来源:网络整理
导读:如果使用 Swift扩展将重载方法添加到Objective-C类,它似乎只调用第一个方法,在运行时产生意外行为或崩溃. Swift类的扩展(与Objective-C相对)可以正常工作.我想确定是否有任何解决方法,并确认这是一个我应该向Apple报告的错误.鉴于Objective-C不支持Swift的重
如果使用 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)

解决方法

ObjC不支持方法重载.当您扩展ObjC类时,代码的接口是ObjC运行时 – 即使您从其他Swift代码调用该类中的Swift代码 – 所以您的类的接口不能使用Swift的特性也出现在ObjC.

正如您所指出的,这可能是编译错误.我推荐filing a bug about that,特别是因为你已经组装了一个方便的测试用例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读