斯威夫特:NaN输出

时间:2016-02-10 03:26:15

标签: swift

以下是SO专家的一些非常基本的代码。我有两个字段(重量和高度)和一个分段控件有两个选项。单击控件时,我会触发一个动作以获取权重和高度字段的值。然后,我做了少量的数学运算,并希望将结果转储到另一个标签字段(结果)。无论何时计算条目,结果字段都填充“NaN”。任何想法为什么?我确定它在某处格式化或转换。

编辑:已更新以指定问题。

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var WeightNumberTextField: UITextField!
    @IBOutlet weak var HeightNumberTextField: UITextField!
    @IBOutlet weak var CalculateType: UISegmentedControl!
    @IBOutlet weak var results: UILabel!

    var weight = Float()
    var height = Float()
    var BMI = Float()


    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func newCalculation(sender: UISegmentedControl) {
        switch CalculateType.selectedSegmentIndex {
        case 0:
            let BMI = (weight * 703) / height;
            results.text = BMI.description;
        case 1:
            let BMI = weight / height;
            results.text = BMI.description;
        default:
            break
        }
    }
}

2 个答案:

答案 0 :(得分:4)

weightheight字段初始化为0.您永远不会修改它们。在浮点中除以0/0会返回NaN(非数字)。

你可能想要这样的东西:

    @IBAction func newCalculation(sender: UISegmentedControl) {
        weight = Float(WeightNumberTextField.text ?? "0") ?? 0
        height = Float(HeightNumberTextField.text ?? "0") ?? 0
        switch CalculateType.selectedSegmentIndex {
        case 0:
            let BMI = (weight * 703) / height;
            results.text = BMI.description;
        case 1:
            let BMI = weight / height;
            results.text = BMI.description;
        default:
            break
        }
    }

答案 1 :(得分:0)

如果它在断点处打破"然后在你的代码中的某个地方,你已经设置了一个。这是代码中的一个点,Xcode调试器会停止(暂停),以便您使用调试器等对代码执行各种操作...

您可以通过以下几种方式之一查看断点的位置:

1)使用"断点导航器"它出现在Xcode最左侧的窗格中,如下所示:

enter image description here

2)通过在代码的阴沟中查找断点。在实际的代码窗格中,您的所有代码都在其中,您将在其左侧看到一个" gutter"这可能会以多种方式出现,具体取决于您如何设置Xcode ...我的显示方式如下(带断点):

enter image description here

note)箭头指向的位置是断点所在的位置。即突出显示的位为蓝色。你可以通过点击它们来启用和禁用它们......如果它被禁用,它就会出现"灰色"就像这样:

enter image description here

最后,关于引用文本字段"填写值"以及"未分段控制操作",您需要:

i)文本字段值:

// Somewhere in a code-block (i.e. a function)
let height = self.HeightNumberTextField.text

// Do some validation i.e. is it a number, is it greater than etc...

ii)从行动中引用分段控制:

// As you can see there's (sender: UISegmentedControl) which 
//     is the segmented control that you're clicking on so your 
//     switch statement should be..

switch sender.selectedSegmentIndex

sender(适用于所有控件)是执行操作的控件,即在这种情况下,您已经使用的UISegmentedControl。如果你有几个UISegmentedControl引用一个动作,这将特别方便。

希望这有帮助!

编辑只需添加一些内容,我个人拥有"默认值"在两个文本字段上都是" 0"因此,当视图加载时,至少有一些东西存在。此外,我将实际的BMI计算结果移动到另一个函数,并从动作中引用它,而不是在动作中将其计算出来。