Проблема при создание калькулятора на свифт

swift
xcode

#1

Что за ошибка?
Также все функции работают кроме действий с дробами. То есть беру условно число 2,5 нажымаю на любое действие(+;-;÷ и т.д.) и сразу выбрасывает с програмы.


#2

Непонятно задаете вопрос, но в вашем листинге в двух местах вижу неоправданное использование восклицательных знаков. Извлекайте значения из опционалов всегда безопасно:
guard let …
или
if let …
Возможно, выбрасывает из-за этого. Возможно, нет. Но с принудительными извлечениями значений через “!” поосторожнее. Лучше не употребляйте их никогда, за редким исключением. Например, при создании объектов из UIKit:
private var myButton: UIButton!

Если вы о warning про character, то Xcode ругается, потому что в swift 4 строки обратно стали массивами. И к свойству count нужно обращаться без characters.


#3

Большое спасибо за ответ. С варнингом про character разобрался, здесь спасибо. Но при действиях с дробями все равно выбрасывает (просто первый раз что-то программирую и делал все по видео уроку) вот ошибка после того как выбрасывает.


#4

У вас там в одной строке аж два восклицательных знака)))
Попробуйте так:

var currentInput: Double {
    get {
        if let text = displayresultlabel.text {
            if let value = Double(text) {
                return value
            }
        }
        return 0
    }
    set {
    //...
    }
}

Можно записать покороче, но так нагляднее. Хорошенько изучите опционалы, это одна из самых классных особенностей swift.

Скорее всего проблема в том, Double() не может преобразовать введенный текст в числовое представление. Например, вы вводите “dfdfsdfs”. Это не преобразуется в тип double. Или вы вводите "2 " (с пробелом/пробелами). Или вы вводите “2,2”, а надо “2.2”. Или можно еще много вариантов придумать. Короче, проверяйте введенные данные на правильность формата. Например, регулярным выражением:

let text = "  2.2  ".trimmingCharacters(in: .whitespacesAndNewlines)
if let _ = text.range(of: "[0-9]+(\\.[0-9]+)?", options: .regularExpression) {
    print ("valid number")
}

#5

спасибо, помогло, действия с дробями уже работают, но все равно ошибка, при нажатие на равно всегда выдает 0, там в return 0 должен быть? спасибо кстати за совет что выучить нужно


#6

Прежде чем данные попадут в displayresultlabel, они должны быть проверены на правильный формат. К примеру, опять же регулярным выражением. Если формат неверный, то вы должны оповестить об этом пользователя. Например, алертом. И не производить никакие операции с числами до тех пока он не введет число в правильном формате.
Тогда return 0 в моем примере оправдано.


#7

Ты просто волшебник, большое спасибо за помощь и советы, все работает.


#8

Не за что. И избавляйтесь от восклицательных знаков. Я смотрю, у вас их там еще полным-полно. А то приложение так и будет падать.