objective-c - Swift Extension 无法向 Objective-C 类添加重载方法

标签 objective-c swift swift-extensions

如果使用 Swift 扩展将重载方法添加到 Objective-C 类,它似乎只调用第一个方法,在运行时产生意外行为或崩溃。 Swift 类(相对于 Objective-C)的扩展可以正常工作。我想确定是否有任何解决方法,并确认这是我应该向 Apple 报告的错误。鉴于 Objective-C 不支持重载方法,而 Swift 支持,我可以想象将两者混合会导致问题。

获得扩展的类都是空的,除了 Objective-C 类有一个 init 函数。 ObjClass 在 .h 和 .m 文件中声明,并使用 Swift 桥接 header 导入。原始 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)

最佳答案

ObjC 不支持方法重载。当你扩展一个 ObjC 类时,你的代码的接口(interface)是 ObjC 运行时——即使你在那个类中从其他 Swift 代码调用你的 Swift 代码——所以你的类的接口(interface)不能使用 Swift 的功能,这些功能不是也存在于 ObjC 中。

如您所见,这可能是一个编译错误。我推荐 filing a bug about that ,特别是因为您已经整理了一个方便的测试用例。

关于objective-c - Swift Extension 无法向 Objective-C 类添加重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712261/

相关文章:

objective-c - 如何修复 No visible @interface for NSString declares the selector JSONValue 错误

ios - 在 IOS 的 UITableView 中选择一个单元格时,表格单元格边框可见

ios - 将 UIImageView 拖放到另一个 UIImageView 中

swift - 为什么是 'there cannot be more than one conformance, even with different conditional bounds' ?

swift - UIImage 调整大小扩展

ios - 仅在符合特定协议(protocol)时才对类进行 Swift 扩展

iphone - forwardInvocation 没有被调用?

iphone - 如何使用 AVAudioPlayer 在 iPhone sdk 中暂停和恢复同一首歌曲

swift - : class that inherits SKSpriteNode with init,如何调用init(颜色:,大小:)

swift - UIPickerView鬼像