当整数不是0,1或2时,程序崩溃

时间:2014-12-08 03:07:17

标签: ios swift

我是所有编程的完全初学者,所以请原谅你可能发现的任何明显的错误。我正在编写一个程序,它接受一个输入数字并告诉用户该数字是否为素数。

@IBOutlet weak var textfield: UITextField!

@IBOutlet weak var label: UILabel!

@IBAction func button(sender: AnyObject) {
    if (textfield.text.isEmpty) {
        label.text = "Please enter a number!"
    } else if (textfield.text == "0" || textfield.text == "1"){
        label.text = "The answer is undefined."
        textfield.text = nil
    } else {
        var input = textfield.text.toInt()
        if (input! % 2 == 0 && input! != 2) {
           label.text = "The number is not prime, one of its divisors is 2."
            textfield.text = nil
        } else if (input! == 2){
            label.text = "The number is indeed prime!"
            textfield.text = nil
        } else {
            var factor = 3
            while (factor <= input) {
                if (input! % factor == 0 && input! != factor) {
                    label.text = "The number is not prime, one of its divisors is \(factor)"
                } else if (input! % factor != 0){
                    factor += 2
                } else if (input! % factor == 0 && input! == factor) {
                    label.text = "The number is indeed prime!"
                    textfield.text = nil
                }
            }

        }
    }
}

我的代码看起来像这样,但如果输入是非0,1或2的任何内容,则会崩溃。我知道有更好的方法来编写这个程序,但我只想弄清楚这个程序到底出了什么问题。 。提前谢谢!

3 个答案:

答案 0 :(得分:2)

如果您要更新label.text,则不会增加导致无限循环的factor break。为这些案例添加 while (factor <= input!) { if (input! % factor == 0 && input! != factor) { label.text = "The number is not prime, one of its divisors is \(factor)" break } else if (input! % factor != 0){ factor += 2 } else if (input! % factor == 0 && input! == factor) { label.text = "The number is indeed prime!" textfield.text = nil break } } 以打破while循环,一切都会好起来:

{{1}}

答案 1 :(得分:1)

这不是你的快速。这是你的编程逻辑。你没有崩溃,你是无限的  循环。

在循环中放入println。
while(factor&lt; = input){                     println(&#34;因子(输入!%因子)&#34;)

因子0 因素0 因素0 因子0

你永远不会最终增加因子。在我的测试用例中,我输入3作为输入。

大卫

答案 2 :(得分:0)

我认为输入返回一个可选变量。

var input = textfield.text.toInt()
//and you force unwrap the input on the this statement:
 if (input! % 2 == 0 && input! != 2) {}

如果文字不是数字,我认为它在这里崩溃了。 看一下String

的扩展名
extension String {

    /// If the string represents an integer that fits into an Int, returns
    /// the corresponding integer.  This accepts strings that match the regular
    /// expression "[-+]?[0-9]+" only.
    func toInt() -> Int?
}