试图重载函数,但Xcode显示错误
我想用Swift做一个计算器。下面是我想出的代码 对于这些开关情况:试图重载函数,但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
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类型继承的。非常感谢您的澄清!上帝保佑您!