HiveBrain v1.2.0
Get Started
← Back to all entries
patternswiftMinor

Basic calculator in Swift 3

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
swiftcalculatorbasic

Problem

I just started learning the basics to Swift 3 about 2 days ago. Since then, I've decided to make a simple calculator that can only do one operation at a time.

I was wondering how efficient this was and what I could possibly do to make it more efficient. Any type of criticism would be helpful too

```
import UIKit

class ViewController: UIViewController {

@IBOutlet var buttonResponseLabel: UILabel!
var userIsCurrentlyTyping: Bool = false
var storedValue: Int = 0;
var currentOperation = 0
var currentNumberInLabel = ""

@IBAction func buttonAppend(_ sender: UIButton)
{
let buttonTitle = sender.currentTitle!

switch buttonTitle
{
case "+":
currentOperation = 1
storedValue = Int(currentNumberInLabel)!
buttonResponseLabel.text = ""
case "-":
currentOperation = 2
storedValue = Int(currentNumberInLabel)!
buttonResponseLabel.text = ""
case "*":
currentOperation = 3
storedValue = Int(currentNumberInLabel)!
buttonResponseLabel.text = ""
case "/":
currentOperation = 4
storedValue = Int(currentNumberInLabel)!
buttonResponseLabel.text = ""
default:

if buttonTitle == "="
{
var finalValue = 0
print(currentNumberInLabel)
let secondStoredValue = Int(currentNumberInLabel)!
if currentOperation == 1
{
finalValue = storedValue + secondStoredValue
buttonResponseLabel.text = ""
buttonResponseLabel.text = String(finalValue)
}
else if currentOperation == 2
{
finalValue = storedValue - secondStoredValue
buttonResponseLabel.text = ""
buttonResponseLabel.text = String(fina

Solution

Try not to repeat yourself and refactor common code to functions. Also you might want to create types (classes, structs, enums) to make things more expressive. Quick example with not so nice new data type (untested):

import UIKit

class ViewController: UIViewController {

    struct Operator {
        var stringRepresentation: String
        var `operator`: (Int, Int) -> Int //quotes required  as operator is a keyword
    }

    var operators = ["+":Operator(stringRepresentation:"+", operator:+),
                 "-":Operator(stringRepresentation:"-", operator:-),
                 "*":Operator(stringRepresentation:"*", operator:*),
                 "/":Operator(stringRepresentation:"/", operator:/)]
    @IBOutlet var buttonResponseLabel: UILabel!
    var userIsCurrentlyTyping: Bool = false
    var storedValue: Int = 0;
    var currentOperation: Operator?
    var currentNumberInLabel = ""
    var buttonTitle = ""

    @IBAction func buttonAppend(_ sender: UIButton) {
        buttonTitle = sender.currentTitle!

        if let chosenOperator = operators[buttonTitle] {
            currentOperation = chosenOperator
            storedValue = Int(currentNumberInLabel)!
            buttonResponseLabel.text = ""
        } else if buttonTitle == "=" {
            showResult()
        } else if userIsCurrentlyTyping {
            currentNumberInLabel = buttonResponseLabel.text! + buttonTitle
            buttonResponseLabel.text = currentNumberInLabel
        } else {
            userIsCurrentlyTyping = true
            buttonResponseLabel.text = buttonTitle
        }

        print("\(currentOperation) \(buttonTitle)")
    }

    func showResult() {
        print(currentNumberInLabel)
        guard let currentOperator = currentOperation else {
            print("This should never happen. Fail silently")
            return
        }
        operate(withOperator: currentOperator.operator)
    }

    func operate(withOperator op: (Int, Int) -> Int){
        let secondStoredValue = Int(currentNumberInLabel)!
        let finalValue = op(storedValue, secondStoredValue)
        buttonResponseLabel.text = String(finalValue)
    }
}


A very good walk-through Swift by implementing a calculator can be found here btw. It's from late 2015, so no Swift3. Maybe you find an update.

Code Snippets

import UIKit

class ViewController: UIViewController {

    struct Operator {
        var stringRepresentation: String
        var `operator`: (Int, Int) -> Int //quotes required  as operator is a keyword
    }

    var operators = ["+":Operator(stringRepresentation:"+", operator:+),
                 "-":Operator(stringRepresentation:"-", operator:-),
                 "*":Operator(stringRepresentation:"*", operator:*),
                 "/":Operator(stringRepresentation:"/", operator:/)]
    @IBOutlet var buttonResponseLabel: UILabel!
    var userIsCurrentlyTyping: Bool = false
    var storedValue: Int = 0;
    var currentOperation: Operator?
    var currentNumberInLabel = ""
    var buttonTitle = ""

    @IBAction func buttonAppend(_ sender: UIButton) {
        buttonTitle = sender.currentTitle!

        if let chosenOperator = operators[buttonTitle] {
            currentOperation = chosenOperator
            storedValue = Int(currentNumberInLabel)!
            buttonResponseLabel.text = ""
        } else if buttonTitle == "=" {
            showResult()
        } else if userIsCurrentlyTyping {
            currentNumberInLabel = buttonResponseLabel.text! + buttonTitle
            buttonResponseLabel.text = currentNumberInLabel
        } else {
            userIsCurrentlyTyping = true
            buttonResponseLabel.text = buttonTitle
        }

        print("\(currentOperation) \(buttonTitle)")
    }

    func showResult() {
        print(currentNumberInLabel)
        guard let currentOperator = currentOperation else {
            print("This should never happen. Fail silently")
            return
        }
        operate(withOperator: currentOperator.operator)
    }

    func operate(withOperator op: (Int, Int) -> Int){
        let secondStoredValue = Int(currentNumberInLabel)!
        let finalValue = op(storedValue, secondStoredValue)
        buttonResponseLabel.text = String(finalValue)
    }
}

Context

StackExchange Code Review Q#149148, answer score: 3

Revisions (0)

No revisions yet.