Я пытаюсь построить калькулятор с помощью Swift. Ниже приведен код, который я придумал.пытается перегрузить функцию, однако ошибка отображения Xcode
Для этих случаев включения:
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 имеет ошибку отображается рядом с функцией одного аргумента, говоря:
Метод "performOperation" с переключателем Objective-C "performOperation" конфликтов с предыдущей декларации Wiht той же цели C селектор
Это вызывает много путаницы для меня. Во-первых, я использую Swift, так почему Objective 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
}
}
}
Большое спасибо за совет. Не возражаете, если я задам следующий вопрос? Пожалуйста, поправьте меня, если я ошибаюсь, но мое понимание того, что вы сказали, это если файл содержит только код Swift, тогда я могу использовать перегрузку имени метода, но поскольку я использую UIViewController, который является типом, унаследованным от типа объекта C , поэтому я не могу использовать перегрузку имени метода и должен назвать эти методы разными именами, это правильно? В очередной раз благодарим за помощь!! –
Да, это правильно. Но я должен добавить, что когда я говорю файл Swift, я имел в виду класс или структуру Swift. А в случае класса Swift он не наследуется от типа Objective C. – totiG
Спасибо вам за разъяснение! Будьте здоровы! –