我正在学习swift,我正在尝试构建一个计算器。我正在尝试创建平方根函数。我已经创建了乘法,加法,减法和除法,并且有一个名为performOperation的函数,有两个双精度。我知道在Swift中,我应该能够用一个双精度创建另一个名为performOperation的函数,而swift足够聪明,可以使用正方形函数的正确函数,但是我在第二个函数时遇到错误performOperation行显示“方法'performOperation'与objective-c选择器与之前使用相同objective-c选择器的声明冲突。”我做错了什么?
以下代码:
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
}
}
}
答案 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()
}
}
“#”强制第一个参数成为签名的一部分,这使得两个签名不同。