2017-01-02 16 views
1

Я абсолютно новым для Swift 3, мой единственный опыт быть некоторые основные HTML и JavaScript обратно в дни перед Microsoft FrontPage, Facebook и т.д.Swift 3: Округление результат, встроенный в текст в простой калькулятор

I Я пытаюсь сделать (относительно) простой калькулятор, который будет делать некоторую математику, чтобы рассчитать, сколько жидкого кислорода мне понадобится для пациентов.

Две проблемы, с которыми я столкнулся, состоят в том, что если кто-то покинет поле пустым, приложение выйдет из строя. Во-вторых, я хотел бы, чтобы результат прошел до одного десятичного знака.

Я нашел ответы о пустых полях и округлении, но не мой пример, и я просто получаю ошибки, которые я не знаю, как исправить.

Пожалуйста, имейте в виду, что ответы на любые вопросы, которые начинаются с «Почему вы сделали ...», являются двоякими: 1), потому что я видел такой пример в Интернете и 2) у меня нет что я делаю.

Код приведен ниже.

// 
// ViewController.swift 
// AECalc 
// 
// Created by Marco Metzler on 12/31/16. 
// Copyright © 2016 Metzler. All rights reserved. 
// 

import UIKit 
import Foundation 

class ViewController: UIViewController { 

@IBOutlet weak var PTLPM: UITextField! 
@IBOutlet weak var LTVVents: UITextField! 
@IBOutlet weak var Vents: UITextField! 
@IBOutlet weak var EmergLPM: UITextField! 
@IBOutlet weak var Ground: UITextField! 
@IBOutlet weak var Flight: UITextField! 
@IBOutlet weak var LOX: UILabel! 



@IBAction func Calculate(_ sender: UIButton) { 
    let aText = PTLPM.text 
    let bText = LTVVents.text 
    let cText = Vents.text 
    let dText = EmergLPM.text 
    let eText = Ground.text 
    let fText = Flight.text 
    let a = Float(aText!) 
    let b = Float(bText!) 
    let c = Float(cText!) 
    let d = Float(dText!) 
    let e = Float(eText!) 
    let f = Float(fText!) 
    let PtReq = (a! + d!) 
    let LTVTot = (b! * 20) 
    let VTot = (c! * 15) 
    let VentTot = (LTVTot + VTot) 
    let AllOx = ((VentTot + PtReq) * 60) 
    let TotTime = (e! + f!) 
    let answer = ((AllOx * TotTime)/804) 

    LOX.text = "LOX required: \(answer) liters." 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    //The code below hides the keypad when you tap blank space on the screen. I would prefer to have a "done" button on the keypad. 

    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))) 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

} 
+0

Если поле пустым, что бы вы хотели, чтобы произошло? Что бы вы хотели сделать, если поле не конвертируется в Float? Использовать значения по умолчанию? Распечатать сообщение? – vacawama

+3

Этот вопрос слишком широк. «Две проблемы, с которыми я сталкиваюсь, - это то, что если кто-то покинет поле пустым, приложение будет разбиваться. Во-вторых, я хотел бы, чтобы результат переместился в одно десятичное место». Вы просто бросаете все свое приложение и говорите «Исправьте это». Выберите проблему _one_ в точке _precise_ вашего кода, скажите, что вы делаете, что хотите, и что происходит. – matt

+0

Вы упомянули, что нашли ответы относительно пустых полей и округления, но они вызывают ошибки. Можете ли вы опубликовать эти ошибки, чтобы мы могли видеть, что вы пробовали и не работали и не проводили вас оттуда? – Bek

ответ

1

Проблема № 1: Blank поле Причины App Крушение

Это потому, что вы сила разворачивать дополнительные значения с !:

let aText = PTLPM.text 
let a = Float(aText!) 
let PtReq = (a! + d!) 

Это приведет к сбою, если текст поле пустое, или String не может быть преобразован в Float.

Вместо этого проверьте, не установлены ли значения nil, безопасно распаковывая их. Один из способов сделать это - с некоторыми операциями guard.

guard let aText = PTLPM.text else { 
    // handle case where text is nil here 
} 

guard let a = Float(aText) else { 
    // handle case where the text is not a valid Float here 
} 

Это позволит убедиться, что ваши переменные являются фактическими значениями перед продолжением.

Проблема № 2: Округление

Это только требует использования в String конструктор, который принимает в формате:

LOX.text = String(format: "%.1f", answer) 
+0

Спасибо ... Я попробую оба эти предложения. Я дам Вам знать... – Marco

+0

Привет, Натан ... спасибо за помощь. Я вставил код, который вы предоставили, и отформатировал его как можно лучше. LOX.text = String (формат: «% .1f», «LOX требуется: \ (ответ) литры».) Приложение запускается и не дает никаких ошибки, но всегда возвращает 0.0 независимо от того, какие числа я помещаю в поля. Итак, округление работает точно так же, как хотелось бы (спасибо!), Но это сломало расчет. Есть идеи? – Marco

+0

Второй аргумент для конструктора строк должен быть числом, а не строкой. Попробуйте это: 'LOX.text = String (формат:«% .1f », ответ)' – nathan