diff --git a/RxExample/RxExample/Examples/Calculator/CalculatorState.swift b/RxExample/RxExample/Examples/Calculator/CalculatorState.swift index bfac1fc14..e41a64f2e 100644 --- a/RxExample/RxExample/Examples/Calculator/CalculatorState.swift +++ b/RxExample/RxExample/Examples/Calculator/CalculatorState.swift @@ -54,57 +54,28 @@ extension CalculatorState { if previousNumber == nil { return CalculatorState(previousNumber: currentNumber, action: .operation(o), currentNumber: nil, inScreen: currentNumber, replace: true) - } - else { + } else { let previous = Double(previousNumber)! let current = Double(inScreen)! - switch action { - case .operation(let op): - switch op { - case .addition: - let result = "\(previous + current)" - return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true) - case .subtraction: - let result = "\(previous - current)" - return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true) - case .multiplication: - let result = "\(previous * current)" - return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true) - case .division: - let result = "\(previous / current)" - return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true) - } - default: + if case let .operation(op) = action { + let result = "\(op.perform(previous, current))" + return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true) + } else { return CalculatorState(previousNumber: nil, action: .operation(o), currentNumber: currentNumber, inScreen: inScreen, replace: true) } - } - } func performEqual() -> CalculatorState { - let previous = Double(previousNumber ?? "0") + let previous = Double(previousNumber ?? "0")! let current = Double(inScreen)! - switch action { - case .operation(let op): - switch op { - case .addition: - let result = "\(previous! + current)" - return CalculatorState(previousNumber: nil, action: .clear, currentNumber: result, inScreen: result, replace: true) - case .subtraction: - let result = "\(previous! - current)" - return CalculatorState(previousNumber: nil, action: .clear, currentNumber: result, inScreen: result, replace: true) - case .multiplication: - let result = "\(previous! * current)" - return CalculatorState(previousNumber: nil, action: .clear, currentNumber: result, inScreen: result, replace: true) - case .division: - let result = previous! / current - let resultText = result == Double.infinity ? "0" : "\(result)" - return CalculatorState(previousNumber: nil, action: .clear, currentNumber: resultText, inScreen: resultText, replace: true) - } - default: + if case let .operation(op) = action { + let result = op.perform(previous, current) + let resultText = (result == Double.infinity) ? "0" : "\(result)" + return CalculatorState(previousNumber: nil, action: .clear, currentNumber: resultText, inScreen: resultText, replace: true) + } else { return CalculatorState(previousNumber: nil, action: .clear, currentNumber: currentNumber, inScreen: inScreen, replace: true) } } diff --git a/RxExample/RxExample/Examples/Calculator/CalculatorViewController.swift b/RxExample/RxExample/Examples/Calculator/CalculatorViewController.swift index eac62b229..86e6460d9 100644 --- a/RxExample/RxExample/Examples/Calculator/CalculatorViewController.swift +++ b/RxExample/RxExample/Examples/Calculator/CalculatorViewController.swift @@ -12,7 +12,6 @@ import RxSwift import RxCocoa #endif - class CalculatorViewController: ViewController { @IBOutlet weak var lastSignLabel: UILabel! @@ -71,42 +70,27 @@ class CalculatorViewController: ViewController { Observable.from(commands) .merge() - .scan(CalculatorState.CLEAR_STATE) { a, x in - return a.tranformState(x) + .scan(CalculatorState.CLEAR_STATE) { previous, action in + previous.tranformState(action) } - .debug("debugging") + .debug("calculator state") .subscribe(onNext: { [weak self] calState in - self?.resultLabel.text = calState.inScreen - switch calState.action { - case .operation(let operation): - switch operation { - case .addition: - self?.lastSignLabel.text = "+" - case .subtraction: - self?.lastSignLabel.text = "-" - case .multiplication: - self?.lastSignLabel.text = "x" - case .division: - self?.lastSignLabel.text = "/" - } - default: + self?.resultLabel.text = self?.formatResult(calState.inScreen) + + if case let .operation(operation) = calState.action { + self?.lastSignLabel.text = operation.sign + } else { self?.lastSignLabel.text = "" } }) .addDisposableTo(disposeBag) } - -//swifts string api sucks - func prettyFormat(str: String) -> String { - if str.hasSuffix(".0") { -// return str[str.startIndex.. String { + if result.hasSuffix(".0") { + return result.substring(to: result.index(result.endIndex, offsetBy: -2)) + } else { + return result } - return str } } - - - - - diff --git a/RxExample/RxExample/Examples/Calculator/Operation.swift b/RxExample/RxExample/Examples/Calculator/Operation.swift index cff835681..2f5ff81fb 100644 --- a/RxExample/RxExample/Examples/Calculator/Operation.swift +++ b/RxExample/RxExample/Examples/Calculator/Operation.swift @@ -14,3 +14,23 @@ enum Operator { case multiplication case division } + +extension Operator { + var sign: String { + switch self { + case .addition: return "+" + case .subtraction: return "-" + case .multiplication: return "×" + case .division: return "/" + } + } + + var perform: (Double, Double) -> Double { + switch self { + case .addition: return (+) + case .subtraction: return (-) + case .multiplication: return (*) + case .division: return (/) + } + } +}