Как я могу заставить свой калькулятор добавить период в Swift?

Вот код моего UIButton

@IBAction private func performOperation(sender: UIButton) {
    if userIsInTheMiddleOfTyping {
        brain.setOperand(displayValue)
        userIsInTheMiddleOfTyping = false
    }
    if let mathematicalSymbol = sender.currentTitle {
        brain.performOperation(mathematicalSymbol)
    }
    displayValue = brain.result
}

Вот моя модель или код контроллера представления

private var operations: Dictionary<String,Operation> = [
    "π":    Operation.Constant(M_PI),
    "e":    Operation.Constant(M_E),
    "√":    Operation.UnaryOperation(sqrt),
    "cos":  Operation.UnaryOperation(cos),
    "✕":    Operation.BinaryOperation({ $0 * $1 }),
    "÷":    Operation.BinaryOperation({ $0 / $1 }),
    "+":    Operation.BinaryOperation({ $0 + $1 }),
    "−":    Operation.BinaryOperation({ $0 - $1 }),
    "±":    Operation.UnaryOperation({ -$0 }),
    "=":    Operation.Equals,
    ".":    Operation.Period
]

private enum Operation {
    case Constant(Double)
    case UnaryOperation((Double) -> Double)
    case BinaryOperation((Double, Double) -> Double)
    case Equals
    case Period
}

func performOperation (symbol: String) {
    if let operation = operations[symbol] {
        switch operation {
        case .Constant(let associatedConstantValue):
            accumulator = associatedConstantValue
            break
        case .UnaryOperation(let associatedFunction):
            accumulator = associatedFunction(accumulator)
            break
        case .BinaryOperation(let associatedFunction):
            executePendingBinaryOperation()
            pending = PendingBinaryOperationInfo(binaryFunction: associatedFunction, firstOperand: accumulator)
            break
        case .Equals:
            executePendingBinaryOperation()
            break
        case .Period:
            displayTextContainsPeriod()
            break
        }
    }
}

private func displayTextContainsPeriod() -> Bool
{

}

Я знаю, чтобы проверить, существует ли существующий период. Мне нужно проверить, содержит ли строка подстроку "." но я не уверен, как получить отображаемый текст в моем func displayTextContainsPeriod


person software is fun    schedule 26.05.2016    source источник


Ответы (3)


Вы выбираете неправильный подход. . не должен быть оператором. Ваш мозг калькулятора не должен быть задействован. Эта работа должна выполняться в вашей ViewController, а не в вашей модели. Он должен работать как цифры и добавлять символ . к строке display, если display еще не содержит ..

Вам следует подумать о случае, когда вводится ., а пользователь не вводит число. Например, вы можете начать отображение с 0. вместо ..

person vacawama    schedule 26.05.2016
comment
Вы разместили свой комментарий под неправильным ответом. Мозг не должен участвовать в вводе числа. Это только для расчета. Вы не вызываете мозг для каждой введенной цифры. Точно так же вы не стали бы вызывать мозг при вводе десятичной точки. Просто добавьте символ . к отображаемой строке, убедившись, что у вас его еще нет. - person vacawama; 26.05.2016

Предполагая, что отображаемый текст находится в UITextField и что вы создали его в раскадровке (если нет, обновите вопрос).

Вам нужно добавить розетку в контроллер

 @IBOutlet var displayTextField: UITextField!

Затем подключите его к полю в раскадровке.

В вашем коде вы можете обратиться к self.displayTextField.text, чтобы получить текущий текст в UITextField.

person Lou Franco    schedule 26.05.2016
comment
Хм, я думал, что работа модели заключается в том, чтобы определить, является ли текст действительным или нет. Поэтому, если кто-то нажмет 1.0.0.0.0.0.0.0, модель просто проигнорирует все файлы . после 1-го. - person software is fun; 26.05.2016
comment
о какой модели вы говорите? - person Lou Franco; 26.05.2016
comment
Какой будет модель в приложении-калькуляторе? - person software is fun; 27.05.2016
comment
Вы должны сделать это сами. Предполагая, что вы делаете CalcModel и у него есть способ проверки текста, вам все равно нужно получить текст из текстового поля и передать его. Итак, вам все еще нужен выход, и затем вы вызываете calcModel.hasPeriod(self.displayTextField.text) - person Lou Franco; 27.05.2016

Вот моя функция touchDigit (спасибо @vacawama), может немного запутанная. Как новичок, надеюсь получить несколько полезных советов. :)

 @IBAction private func touchDigit(sender: UIButton) {
    let digit = sender.currentTitle!
    if userIsInTheMiddleOfTyping{
        let textCurrentlyInDisplay = display.text!
        display.text = (digit == "." && textCurrentlyInDisplay.rangeOfString(".") != nil) ? textCurrentlyInDisplay : textCurrentlyInDisplay + digit

    }else{
        display.text = (digit == ".") ? "0." : digit
    }
    userIsInTheMiddleOfTyping = true
}
person Halo Fool    schedule 20.06.2016