2016-03-03 2 views
0

Я пытаюсь построить калькулятор с помощью 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 
     } 
    } 

} 

ответ

0

UIViewController наследует от цели типа C (UIViewController) - даже если вы используете только быстрые. Если вы создали быстрый файл, вы можете использовать переименования методов, как вы это делали. Поэтому нужно изменить одно из ваших действий.

+0

Большое спасибо за совет. Не возражаете, если я задам следующий вопрос? Пожалуйста, поправьте меня, если я ошибаюсь, но мое понимание того, что вы сказали, это если файл содержит только код Swift, тогда я могу использовать перегрузку имени метода, но поскольку я использую UIViewController, который является типом, унаследованным от типа объекта C , поэтому я не могу использовать перегрузку имени метода и должен назвать эти методы разными именами, это правильно? В очередной раз благодарим за помощь!! –

+0

Да, это правильно. Но я должен добавить, что когда я говорю файл Swift, я имел в виду класс или структуру Swift. А в случае класса Swift он не наследуется от типа Objective C. – totiG

+0

Спасибо вам за разъяснение! Будьте здоровы! –

Смежные вопросы