Swift不让我有两个同名的选择器

时间:2015-05-18 05:08:16

标签: ios xcode swift

我正在学习,我正在尝试构建一个计算器。我正在尝试创建平方根函数。我已经创建了乘法,加法,减法和除法,并且有一个名为performOperation的函数,有两个双精度。我知道在Swift中,我应该能够用一个双精度创建另一个名为performOperation的函数,而足够聪明,可以使用正方形函数的正确函数,但是我在第二个函数时遇到错误performOperation行显示“方法'performOperation'与选择器与之前使用相同选择器的声明冲突。”我做错了什么?

以下代码:

import UIKit

class ViewController: UIViewController
{
@IBOutlet weak var display: UILabel!

var userIsTyping = false

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

}

@IBAction func operate(sender: UIButton) {
    let operation = sender.currentTitle!
    if userIsTyping {
        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() {
    userIsTyping = false
    operandStack.append(displayValue)
    println("operandStack = \(operandStack)")
}

//Changes String Value to a Double
var displayValue: Double {
    get {
        return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
    }
    set {
        display.text = "\(newValue)"
        userIsTyping = false
    }
}
}

1 个答案:

答案 0 :(得分:1)

改变这个:

func performOperation(#operationWithOneParametr: Double -> Double)

为此:

func performOperation(#operationWithTwoParameters: (Double) -> Double)

所有闭包必须如:(parameters) -> return type

有关Closures的更多详细信息,请查看Apple文档: The Swift Programming Language - Closures

此外,这些函数具有相同的签名,不受Swift的支持,修复它会声明这些函数如下:

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

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

“#”强制第一个参数成为签名的一部分,这使得两个签名不同。