Swift2.0在Xcode7下函数重载问题
在斯坦福大学《Developing iOS 8 Apps with Swift》课程第二讲里,在编写计算器平方根功能的时候,用到了Swift的重载特性,下面是事例代码:
func performOperation(operation: Double -> Double)
{
if operandStack.count >= 1 {
displayValue = operation(operandStack.removeLast())
enter()
}
}
func performOperation(operation: (Double, Double) -> Double)
{
if operandStack.count >= 2 {
displayValue = operation(operandStack.removeLast(), operandStack.removeLast())
enter()
}
}
这两个函数在Swift1.0和旧版本的Xcode下不会出现错误,但是在Xcode7和Swift2.0下会出现下面这个错误
Compiler error: Method with Objective-C selector conflicts with previous declaration with the same Objective-C selector
这是因为在Swift1.2之后,对@objc方法和类的检测变得严格了,在视频中上面方法所在的类继承了UIViewController,在Swift中,如果你的类继承自 Objective-C,编译器会自动在所有的变量、方法、属性前加 @objc,而在Objective-C中,这种重载是不支持的。
这里有几种方法可以解决这个问题:
1.修改函数名
将两个函数设置不同的名字。
func performOperation(operation: Double -> Double)
func performOperation1(operation: (Double, Double) -> Double)
2.设置私有属性
将两个函数其中之一或都设置为私有属性。
private func performOperation(operation: Double -> Double)
private func performOperation(operation: (Double, Double) -> Double)
3.@objc()标签
可以在其中一个函数上加上@objc()标签,括号中填上函数的新名称。
@objc(example:)
func performOperation(operation: Double -> Double)
func performOperation(operation: (Double, Double) -> Double)
4.@nonobjc标签
在其中或两个函数上加上@nonobjc标签。
@nonobjc
func performOperation(operation: Double -> Double)
@nonobjc
func performOperation(operation: (Double, Double) -> Double)
如果还有不懂的童鞋,可以点击下面这个链接,里面有更详细的回答:
http://stackoverflow.com/questions/29457720/compiler-error-method-with-objective-c-selector-conflicts-with-previous-declara/29670644#29670644
另:文中有什么错误还望指出。