目前,我的项目使用Swift和Objectice-C两种语言。为了让它发挥作用,我遵循了official documentation的指导原则。现在我可以在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
}
自动生成的文件“MyNameProductModule-Swift.h”无法编译,因为存在具有“相同”签名的方法。
问题:
a)我错过了重要的事情吗?
b)除了重命名方法之外,还有其他解决方案吗?
c)如果我将使用Swift创建一个框架/库,如果此框架/库设计为与Objective C一起使用,我是否应该注意不编写任何重载方法?
谢谢!
答案 0 :(得分: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
}
或者如果您根本不打算在项目的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
}
答案 1 :(得分:5)
a)我错过了重要的事情吗?
不,你不是
b)除了重命名方法之外,还有其他解决方案吗?
不幸的是没有。但是,您可以保留已实现的方法,并添加两个调用此方法的函数,这些函数仅用于暴露给Objective-C。这样,Swift代码仍然可以使用方法重载版本。
c)如果我要用Swift创建一个框架/库,我应该小心 如果此框架/库是,则不写任何重载方法 旨在将其与Objective C一起使用?
是的,如果你想编写一个供Objective-C和Swift使用的框架,你需要确保API与Objective-C完全兼容。有许多Swift功能与Objective-C不兼容。您仍然可以在框架内部使用它们,但它们不能成为您将向Objective-C公开的API的一部分。
答案 2 :(得分:0)
当我在斯坦福大学斯威夫特学院学习时,我也解决了同样的问题。然后我通过使用下面的链接找到了解决方案,我在这里得到了清楚的理解。
斯坎福德课程是在旧版Swift和Xcode出现时制作的,Xcode没有对这个错误做出反应。它是XCode中的一个错误,它允许覆盖此方法。你应该用不同的名字编写方法来实现你想要的目标。
https://www.reddit.com/r/swift/comments/34yusl/help_with_function_overloading/