【问题标题】:Swift 1.2 not working with same function name and different parameter [duplicate]Swift 1.2 不能使用相同的函数名和不同的参数 [重复]
【发布时间】:2015-08-21 12:20:16
【问题描述】:

我有 2 个名称相同但参数不同的函数。

第一个接受一个函数作为参数,该函数接受 2 个双精度并返回一个。

第二个接受一个函数作为参数,该函数接受 1 个 double 并返回一个。这在 Swift 1.1 中有效,在 Xcode 6.1.1 上测试,但是在 Swift 1.2 中,在 Xcode 6.4(beta)上测试,这不起作用并给我这个错误:

方法 'performOperation' 与 Objective-C 选择器'performOperation:' 与具有相同 Objective-C 选择器的先前声明冲突

我该怎么做才能使它起作用,为什么会这样? 我知道我可以用另一种方法求平方根,但我想知道问题出在哪里。

编辑

 @IBAction func operate(sender: UIButton) {
        let operation = sender.currentTitle!
        if userIsInMiddleOfTypingANumber{
            enter()
        }
        switch operation{
        case "×" : performOperation {$0 * $1}
        case "÷" : performOperation {$1 / $0}
        case "+" : performOperation {$0 + $1}
        case "−" : performOperation {$1 - $0}
        case "√" : performOperation {sqrt($0)}
        default : break
        }
    }

    func performOperation(operation : (Double,Double) -> Double){
        if operandStack.count >= 2{
            displayValue = operation(operandStack.removeLast(),operandStack.removeLast())
            enter()
        }
    }

    func performOperation(operation : Double -> Double) {
        if operandStack.count >= 1{
            displayValue = operation(operandStack.removeLast())
            enter()
        }
    }

【问题讨论】:

  • 发布错误所在的方法和行以帮助人们回答
  • @WillM.够了吗?

标签: swift


【解决方案1】:

你不能重载 Objective-C 可以看到的方法,因为 Objective-C 没有重载:

func performOperation(operation : (Double,Double) -> Double){
}
func performOperation(operation : Double -> Double) {
}

(事实上,在 Swift 1.2 之前的 Swift 中允许这样做是一个错误;Swift 1.2 填补了漏洞并修复了该错误。)

简单的解决方案:对 Objective-C 隐藏这些方法。例如,将它们都声明为private

更棘手的解决方案:更改 Objective-C 看到其中之一的名称。例如:

func performOperation(operation : (Double,Double) -> Double){
}
@objc(performOperation2:) func performOperation(operation : Double -> Double) {
}

或者,Swift 2.0 中的新功能,您可以在 Objective-C 中隐藏其中一个或两个,而无需将其设为私有:

@nonobjc func performOperation(operation : (Double,Double) -> Double){
}
func performOperation(operation : Double -> Double) {
}

【讨论】:

  • 你也可以使用 @objc(...) 给他们不同的 Obj-C 选择器名称,对吧?
  • @nielsbot 是的,只要给其中一个不同的 objc 名称就足够了。我会将其添加到答案中。
  • 这个实际的例子进入了 WWDC 2015 session 401 视频。机会有多大?
  • 这很有趣——我得去找找那个
  • 感谢您指出这一点:)
猜你喜欢
  • 2015-08-12
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多