试图重载函数,但Xcode显示错误

试图重载函数,但Xcode显示错误,xcode,swift,function,overloading,Xcode,Swift,Function,Overloading,我想用Swift做一个计算器。下面是我想出的代码 对于这些开关情况: case "×":performOperation {$0 * $1} case "÷":performOperation {$1 / $0} case "+":performOperation {$0 + $1} case "−":performOperation {$1 - $0} 它接受一个双参数函数: func performOperation(operation: (Double, Double) -> Do

我想用Swift做一个计算器。下面是我想出的代码

对于这些开关情况:

case "×":performOperation {$0 * $1}
case "÷":performOperation {$1 / $0}
case "+":performOperation {$0 + $1}
case "−":performOperation {$1 - $0}
它接受一个双参数函数:

func performOperation(operation: (Double, Double) -> Double){
    if operandStack.count >= 2{
        displayValue = operation(operandStack.removeLast(), operandStack.removeLast())
        enter()
    }
}
对于此开关情况:

case "√":performOperation {sqrt($0)}
我提出了一个重载函数,它只接受一个参数:

func performOperation(operation: Double -> Double){
    if operandStack.count >= 1{
        displayValue = operation(operandStack.removeLast())
        enter()
    }
}
但是,Xcode在单参数函数旁边显示了一个错误,表示:

使用Objective-C选择器“performOperation”的方法“performOperation” 与具有相同目标C选择器的先前声明冲突

这给我造成了很大的困惑。首先,我用的是Swift,为什么要用C?第二,我怎样才能解决这样的问题?请帮帮我

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var display: UILabel!

    var userIsInTheMiddleOfTypingANumber = false

    @IBAction func appendDigit(sender: UIButton) {
        let digit = sender.currentTitle!
        if userIsInTheMiddleOfTypingANumber {
            display.text = display.text! + digit
        } else {
            display.text = digit
            userIsInTheMiddleOfTypingANumber = true
        }
    }

    @IBAction func operate(sender: UIButton) {
        let operation = sender.currentTitle!
        if userIsInTheMiddleOfTypingANumber {
            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()
        }
    }

    var operandStack = Array<Double>()

    @IBAction func enter() {
        userIsInTheMiddleOfTypingANumber = false
        operandStack.append(displayValue)
        print("operantStack = \(operandStack)")
    }

    var displayValue: Double {
        get {
            return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
        }
        set {
            display.text = "\(newValue)"
            userIsInTheMiddleOfTypingANumber = false
        }
    }

}
导入UIKit
类ViewController:UIViewController{
@IBVAR显示:UILabel!
var userIsInTheMiddleOfTypingANumber=false
@iAction func appendDigit(发送方:UIButton){
让digit=sender.currentTitle!
如果用户为InthemiddleoftypingNumber{
display.text=display.text!+数字
}否则{
display.text=数字
USERISINTHEMIDLEOFTYPINGANAMER=真
}
}
@iAction func operate(发送方:UIButton){
让操作=sender.currentTitle!
如果用户为InthemiddleoftypingNumber{
输入()
}
开关操作{
案例“×”:执行操作{$0*$1}
案例“÷”:性能操作{$1/$0}
案例“+”:执行操作{$0+$1}
案例”−":性能操作{$1-$0}
案例”√“:性能操作{sqrt($0)}
默认值:中断
}
}
函数执行操作(操作:(双精度,双精度)->双精度){
如果操作数Stack.count>=2{
displayValue=操作(操作数堆栈.removeLast(),操作数堆栈.removeLast())
输入()
}
}
功能执行操作(操作:双击->双击){
如果操作数Stack.count>=1{
displayValue=操作(操作数堆栈.removeLast())
输入()
}
}
变量堆栈=数组()
@iAction func enter(){
userIsInTheMiddleOfTypingANumber=false
操作数堆栈.append(显示值)
打印(“操作数堆栈=\(操作数堆栈)”)
}
var显示值:双精度{
得到{
返回NSNumberFormatter().numberFromString(display.text!)!.doubleValue
}
设置{
display.text=“\(newValue)”
userIsInTheMiddleOfTypingANumber=false
}
}
}

UIViewController继承自目标C类型(UIViewController)-即使您只使用swift。如果您创建了一个仅使用swift的文件,您会发现您可以像以前一样使用方法名称重载。因此您的一个性能操作需要更改。

非常感谢您的建议。您介意我问一个后续问题吗?如果我错了,请纠正我,但我对您所说的理解是如果le只包含Swift代码,那么我可以使用方法名重载,但因为我使用的是UIViewController,它是从对象C类型继承的类型,因此我不能使用方法名重载,必须给这些方法命名不同的名称,对吗?再次感谢您的帮助!!是的,这是正确的。但我说的时候应该补充一下Swift文件我指的是Swift类或结构。对于Swift类,它不是从目标C类型继承的。非常感谢您的澄清!上帝保佑您!