Swift2.0在Xcode7下函数重载问题

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

另:文中有什么错误还望指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值