在Objective C中使用Swift clases和重载方法

Víc*_*tos 4 overloading objective-c swift

目前,我的项目使用Swift和Objectice-C两种语言.为了让它发挥作用,我遵循了官方文档中的指导原则.现在我可以在Objective-C中使用Swift,反之亦然.

但是当一些Swift分支有重载方法时,问题就出现了.Swift支持方法重载但不支持Objective-C.

例:

func random(#lower: Int , upper: Int) -> Int {
    return lower + Int(arc4random_uniform(UInt32(upper - lower + 1)))
}

func random(#lower: CGFloat , upper: CGFloat) -> CGFloat {
    return CGFloat(arc4random() % 1) / 0
}
Run Code Online (Sandbox Code Playgroud)

自动生成的文件"MyNameProductModule-Swift.h"无法编译,因为存在具有"相同"签名的方法.

问题:

a)我错过了重要的事情吗?

b)除了重命名方法之外,还有其他解决方案吗?

c)如果我将使用Swift创建一个框架/库,如果此框架/库设计为与Objective C一起使用,我是否应该注意不编写任何重载方法?

谢谢!

And*_*rew 6

从swift2.0开始,如果您计划在Objective C中使用两者,则可以区分:

@objc(randomLoInt:HiInt:)
func random(#lower: Int , upper: Int) -> Int {
    return lower + Int(arc4random_uniform(UInt32(upper - lower + 1)))
}

@objc(randomLoFlt:HiFlt:)
func random(#lower: CGFloat , upper: CGFloat) -> CGFloat {
    return CGFloat(arc4random() % 1) / 0
}
Run Code Online (Sandbox Code Playgroud)

或者如果您根本不打算在项目的ObjC方面使用它,只需使用:

@nonobjc
func random(#lower: Int , upper: Int) -> Int {
    return lower + Int(arc4random_uniform(UInt32(upper - lower + 1)))
}

@nonobjc
func random(#lower: CGFloat , upper: CGFloat) -> CGFloat {
    return CGFloat(arc4random() % 1) / 0
}
Run Code Online (Sandbox Code Playgroud)


dre*_*wag 5

a)我错过了重要的事情吗?

不,你不是

b)除了重命名方法之外,还有其他解决方案吗?

不幸的是.但是,您可以保留已实现的方法,并添加两个调用此方法的函数,这些函数仅用于暴露给Objective-C.这样,Swift代码仍然可以使用方法重载版本.

c)如果我将使用Swift创建一个框架/库,如果此框架/库设计为与Objective C一起使用,我是否应该注意不编写任何重载方法?

是的,如果您想编写一个供Objective-C和Swift使用的框架,您需要确保API与Objective-C完全兼容.有许多Swift功能与Objective-C不兼容.您仍然可以在框架内部使用它们,但它们不能成为您将向Objective-C公开的API的一部分.