Приложение-калькулятор не получает многозначные числа, а операции всегда возвращают ноль?

Я использую Swift 4, и все числа в Int.

Итак, я сделал файл класса расчета:

import Foundation
import UIKit

class Calculation {

    var result = Int()
    var operationButton = String()
    var currentNumber = Int()

    func calculator() {

        switch operationButton {
        case "+":
            result = result + currentNumber
        case "-":
            result = result - currentNumber
        case "*":
            result = result * currentNumber
        case "/":
            result = result / currentNumber
        case "=":
            result = currentNumber
        default:
            break
        }

    }

        func textClear() {
            result = 0
            currentNumber = 0
            operationButton = "="
    }

И затем я сделал 3 функции в UIControllerView для кнопки AC, кнопки чисел и кнопки операций, чтобы получить «0-9» и «-, +, *,/, =" непосредственно из заголовка кнопки.

    class ViewController: UIViewController {


    @IBOutlet weak var resultTextField: UITextField!

    var calculation = Calculation()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        calculation.operationButton = "="
        resultTextField.text = "\(calculation.result)"
    }


    @IBAction func allClearButtonPressed(_ sender: UIButton) {
        calculation.textClear()
        resultTextField.text = "\(calculation.result)"
    }

    @IBAction func operationButtonPressed(_ sender: UIButton) {

        calculation.operationButton = sender.titleLabel!.text as String!
            calculation.operationButton = sender.titleLabel!.text!
        calculation.calculator()
        resultTextField.text = "\(calculation.result)"
    }

    @IBAction func numberButtonPressed(_ sender: UIButton) {

        calculation.currentNumber = Int((sender.titleLabel?.text)!)!
        let numberInput = String(calculation.currentNumber)
        resultTextField.text = numberInput
    }
}

Первая проблема заключается в том, что всякий раз, когда я пытаюсь ввести число, например 21, оно просто возвращает 2, а затем заменяется на 1. Вторая проблема заключается в операторах, которые всегда возвращают ноль в «resultTextField».


person ciklukylok    schedule 09.11.2017    source источник
comment
Какой расчет вы проверили? Каково значение operationButton при вызове calculator?   -  person Yannick    schedule 09.11.2017
comment
@Yannick Это всегда ноль, всякий раз, когда я нажимаю любую функциональную кнопку, для результата TextField устанавливается ноль.   -  person ciklukylok    schedule 09.11.2017
comment
Что print(operationButton) печатает внутри функции calculator()?   -  person Yannick    schedule 09.11.2017
comment
@Yannick Он печатает строку операции, например + или *, когда каждый из них нажимается в симуляторе.   -  person ciklukylok    schedule 09.11.2017


Ответы (1)


Ваша функция numberButtonPressed читает текст кнопки, заменяет currentNumber и затем назначает его resultTextField.text. Вам нужна функция, которая добавляет новую цифру к вашему текущему номеру. Внутри вашего класса Calculator.

func pressedDigit(_ digit: Int) {
    currentNumber = currentNumber * 10 + digit
}

Затем вы можете вызвать эту функцию и присвоить currentNumber вашему resultTextField.

@IBAction func numberButtonPressed(_ sender: UIButton) {
    guard let digit = sender.titleLabel?.text?.flatMap({ Int(String($0)) }) else { return }
    calculation.pressedDigit(value: digit)
    resultTextField.text = "\(calculation.currentNumber)"
}

Вы также должны сбросить currentNumber после каждого расчета.

person Yannick    schedule 09.11.2017
comment
Этот .flatMap получает только символы, и моя ошибка компилятора говорит: не удается вызвать инициализатор для типа «Int» со списком аргументов типа «((Character))» - person ciklukylok; 09.11.2017
comment
К сожалению, это тоже не работает. Боюсь, это может быть слишком просто, чтобы кто-то мог упомянуть об этом. - person ciklukylok; 10.11.2017