什么是可选变量?

时间:2014-09-24 13:48:16

标签: ios xcode swift

如果数字是素数,我有以下代码可以解决;

@IBAction func isPrimeBtn(sender: AnyObject) {

    if(isPrimeTxt.text.isEmpty){
        isPrimeResultLbl.text = "Please Enter A Value";
    }else{

        var value = isPrimeTxt.text.toInt();
        println(value);

        if(value == 0){
            println("value was 0");
            isPrimeResultLbl.text = "Its Not";
        }else{
            for(var i = 3; i * i < value; i += 2){
                println("value was 0");
                if(value! % i == 0){
                    isPrimeResultLbl.text = "Its Not";
                }
            }
            isPrimeResultLbl.text = "Its Prime!!";
        }
    }
}

当我使用println(value)打印值时,我得到Optional 22,如果我检查变量是0则为真。

我做错了什么?

由于

2 个答案:

答案 0 :(得分:2)

这里有一些问题。首先,您在模数测试中正确使用value!,但在第一个测试和for循环中,您使用value。我建议您使用if let块,因此值不是可选的:

if let value = isPrimeTxt.text.toInt() {
    // now you know it's an integer
    // ... do your test
} else {
    // some error message
}

然而,即使你这样做,你的逻辑错误有三个:

1)在isPrimeResultLbl.text = "Its Prime!!"循环

之后总是执行for

2)对于少于10的所有内容都不正确,因为如果for (var i = 3; i * i < value; i += 2) {3 * 3 >= value永远不会执行。

3)你需要开始检查除数为2,而不是3. 16将使用你的算法显示为素数(尽管4&amp; 8不会,因为它们低于9!)

答案 1 :(得分:1)

如果prime.text是“abc”会怎样?会发生什么转换为toInt()将失败。因为它可能失败,toInt()不返回整数,它返回一个可选的整数。结果是整数或没有。当您调用println时,不打印整数,您打印一个可选的整数。这就是println打印的内容 - 它表示“可选22”。它可能会说“空”之类的东西。

如果你打印价值!而不是值,你告诉Swift你100%确定可选的整数值实际上在那里。如果不是,表达式值!会崩溃。如果它在那里,println将打印22.因此感叹号将可选项转换为适当的值,或转换为崩溃。