Skip to content

Instantly share code, notes, and snippets.

@soemarko
Last active March 23, 2017 18:31

Revisions

  1. soemarko revised this gist Mar 23, 2017. 1 changed file with 8 additions and 1 deletion.
    9 changes: 8 additions & 1 deletion CalculatorViewController.swift
    Original file line number Diff line number Diff line change
    @@ -2,7 +2,14 @@
    // Created by Soemarko Ridwan on 3/23/17.
    // Copyright © 2017 Soemarko Ridwan. All rights reserved.
    //

    // Dependencies: (to simplify the code)
    // - ActionKit: https://github.com/ActionKit/ActionKit/tree/swift3
    // For closure style buttons
    // - AutoLayout Helper: https://github.com/ustwo/autolayout-helper-swift
    // I was never a fan of interface builder, a lot more across devices.
    //
    // Photo: https://tmblr.co/ZBVAFy2Js5KA6
    //
    import UIKit

    class aViewController: UIViewController, UITextFieldDelegate {
  2. soemarko created this gist Mar 23, 2017.
    156 changes: 156 additions & 0 deletions CalculatorViewController.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,156 @@
    //
    // Created by Soemarko Ridwan on 3/23/17.
    // Copyright © 2017 Soemarko Ridwan. All rights reserved.
    //

    import UIKit

    class aViewController: UIViewController, UITextFieldDelegate {

    var field: UITextField? = nil
    var operand: String? = ""

    override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    let wrapper = UIView()
    self.view.addSubview(wrapper)

    wrapper.addTopConstraint(toView: self.view, constant:80.0)
    wrapper.addLeftConstraint(toView: self.view, constant:10.0)
    wrapper.addRightConstraint(toView: self.view, constant:-10.0)
    wrapper.addHeightConstraint(toView: nil, constant: 40.0)
    wrapper.backgroundColor = UIColor(white: 0.85, alpha: 0.9)

    field = UITextField()

    wrapper.addSubview(field!)
    field?.fillSuperView(UIEdgeInsetsMake(5, 10, 5, 10))

    field?.keyboardType = .decimalPad

    let toolBar = UIToolbar()
    toolBar.barStyle = .default
    toolBar.isTranslucent = true

    let clearButton = UIBarButtonItem(title: "clear") {
    // clear
    self.field?.text = ""
    self.operand = ""
    }
    let addButton = UIBarButtonItem(title: "+") {
    // add
    if self.operand != "" {
    let result = self.compute(string: (self.field?.text)!, operand: self.operand!)
    self.field?.text = String(result)
    }
    self.operand = "+"
    self.field?.text?.append("+")
    }
    let subtractButton = UIBarButtonItem(title: "-") {
    // sub
    if self.operand != "" {
    let result = self.compute(string: (self.field?.text)!, operand: self.operand!)
    self.field?.text = String(result)
    }
    self.operand = "-"
    self.field?.text?.append("-")
    }
    let multiplyButton = UIBarButtonItem(title: "*") {
    // mul
    if self.operand != "" {
    let result = self.compute(string: (self.field?.text)!, operand: self.operand!)
    self.field?.text = String(result)
    }
    self.operand = "*"
    self.field?.text?.append("*")
    }
    let divideButton = UIBarButtonItem(title: "/") {
    // div
    if self.operand != "" {
    let result = self.compute(string: (self.field?.text)!, operand: self.operand!)
    self.field?.text = String(result)
    }
    self.operand = "/"
    self.field?.text?.append("/")
    }
    let equalButton = UIBarButtonItem(title: "=") {
    // equal
    if self.operand != "" {
    let result = self.compute(string: (self.field?.text)!, operand: self.operand!)
    self.field?.text = String(result)
    }
    self.operand = ""
    }

    let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let fixedSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
    fixedSpace.width = 20.0

    toolBar.setItems([clearButton, flexSpace, addButton, fixedSpace, subtractButton, fixedSpace, multiplyButton, fixedSpace, divideButton, fixedSpace, equalButton, fixedSpace], animated: false)


    toolBar.isUserInteractionEnabled = true
    toolBar.sizeToFit()

    field?.inputAccessoryView = toolBar
    field?.delegate = self
    }

    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    field?.becomeFirstResponder()
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let char = string.cString(using: String.Encoding.utf8)!
    let isBackSpace = strcmp(char, "\\b")

    if isBackSpace == -92 {
    if (textField.text?.hasSuffix("+"))! ||
    (textField.text?.hasSuffix("-"))! ||
    (textField.text?.hasSuffix("*"))! ||
    (textField.text?.hasSuffix("/"))! {
    self.operand = ""
    print("remove operand")
    }
    }

    return true
    }

    func compute(string: String, operand: String) -> Double {
    let comps = string.components(separatedBy: operand)

    if comps.count == 0 {
    return 0
    }
    else if comps.count == 1 {
    return Double(comps[0])!
    }

    let left = Double(comps[0]) ?? 0.0
    let right = Double(comps[1]) ?? 0.0

    switch operand {
    case "+":
    return left + right
    case "-":
    return left - right
    case "*":
    return left * right
    case "/":
    return left / right
    default:
    return 0
    }
    }

    }