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

时间:2014-08-30 16:25:52

标签: objective-c swift overloading

目前,我的项目使用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一起使用,我是否应该注意不编写任何重载方法?

谢谢!

3 个答案:

答案 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/