Шаг 1:
Определите, что должен делать класс бизнес-логики c, а что нет:
- Поскольку это чистая логика c, это должно быть агности c от системы тегов. Вы должны предоставить это чисто математические модели.
- Он должен отправлять сообщения на ваш контроллер представления, когда вычисления завершены, или экран должен быть очищен.
Шаг 2:
Определите ваши модели как необработанные перечисления:
enum Operand {
case plus
case minus
case times
case divisor
}
enum SpecialOperands {
case dot
case clear
case whitespace
case compute
}
Шаг 3 (В файле CalculatorBusinessLogi c .swift):
Определить что должен делать бизнес-класс, предоставляя контракт, который он должен удовлетворять:
protocol CalculatorBusinessLogic {
var delegate: CalculatorBusinessLogicDelegate? { get set }
func provideNumberInput(number: Int)
func provideOperandInput(operand: Operand)
func provideSpecialOperandInput(operand: SpecialOperands)
}
И какие результаты он должен отправить обратно вашему контроллеру представления:
protocol CalculatorBusinessLogicDelegate: class {
func onComputationDone(previousNumber: Int, currentNumber: Int, operand: Operand, result: Int)
func clearScreen()
}
Шаг 4: (В файле Calculator.swift):
Выполните контракт, переместите все связанные с логикой c атрибуты в класс:
class Calculator: CalculatorBusinessLogic {
weak var delegate: CalculatorBusinessLogicDelegate?
var numberOnDisplay: Double = 0
var previousNumber: Double?
var currentNumber: Double?
var currentOperand: Operand?
var operand = 0
var isPerformingOperand = false
// TODO: handle inputs here, fire delegate when needed to notify View Controller
func provideNumberInput(number: Int) {
//...
}
func provideOperandInput(operand: Operand) {
//...
}
func provideSpecialCharacterInput(operand: SpecialOperands) {
//...
if operand == .clear {
delegate?.clearScreen()
}
if operand == .compute, let previousNumber = self.previousNumber, let currentOperand = self.currentOperand, let currentNumber = self.currentNumber {
delegate?.onComputationDone(previousNumber: previousNumber, currentNumber: currentNumber, operand: currentOperand, result: /* compute result here */)
}
//...
}
}
Используя Test Driven Разработка здесь может помочь вам обработать сложные случаи ошибок (неправильный операнд, деление на ноль ...)
Шаг 5: (В вашем файле ViewController.swift):
Объявить лог c класс:
var calculatorLogic: CalculatorBusinessLogic = Calculator()
Установить делегата в viewDidLoad:
calculatorLogic.delegate = self
Запустить функции калькулятора logi c всякий раз, когда вы обнаружите соответствующие входы. Реализуйте делегата для реагирования на результаты вычислений:
extension ViewController: CalculatorBusinessLogicDelegate {
func onComputationDone(previousNumber: Int, currentNumber: Int, operand: Operand, result: Int) {
lblDisplay.text = "\(result)"
}
func clearScreen() {
lblDisplay.text = ""
}
}
Подробнее о том, как разделить классы в приложении iOS, можно узнать, прибегая к помощи архитектуры адаптеров портов / чистой архитектуры.