Ваш сбой связан с тем, что умножение Int
не может обработать такие числа, используйте Double
.
Оба ваших действия делают одно и то же, попробуйте поместить код, который будет повторно использоваться внутри func
.
Вам также нужно посмотреть на дополнительные функции и как их использовать. Вот пример.
func updateTotalCost() {
if let quantity = Double(QtyText.text ?? ""),
let unitPrice = Double(UnitPriceText.text ?? "") {
TotalCostText.text = String(quantity * unitPrice)
} else {
// ???
TotalCostText.text = ""
}
}
@IBAction func Qty_EndEdit(_ sender: Any) {
updateTotalCost()
}
@IBAction func UnitPrice_EndEdit(_ sender: Any) {
updateTotalCost()
}
Я рассечу некоторые из них:
QtyText.text ?? ""
-> Если QtyText.text равен nil, замените его пустой строкой, в противном случае используйте значение в QtyText.text
Double(QtyText.text ?? "")
-> Построить Double from a
String , which is guaranteed non-nil (since we forced it to be an empty
String`, даже если QtyText.text был равен nil)
Этот конструктор Double()
может сам по себе возвращать nil, если строка, переданная конструктору, не имеет допустимого значения Double
(например, String
"abcd" не может вычисляться до Double
). Поэтому мы заключаем это в оператор if let
, чтобы защитить себя от конструктора Double()
, который не может создать Double
из нашего String
:
if let quantity = Int(QtyText.text ?? "")
Это говорит компилятору:
Оцените это как истинное, только если то, что я помещаю в переменную количества, не равно нулю.
Наконец, мы объединяем два оператора if запятыми:
if let quantity = Int(QtyText.text ?? ""),
let unitPrice = Int(UnitPriceText.text ?? "") {
Внутри этой части оператора if
мы гарантируем, что количество и unitPrice действительны Doubles
, и что мы можем выполнить вычисление.
Я не уверен, что вам будет, пожалуйста, результат String(myDoubleNumber)
, но тогда вам следует изучить форматирование чисел, чтобы получить то, что вы хотите.