2014-09-24 68 views
-2

我有以下代码来计算出数字是否为素数;什么是可选变量?

@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(值)打印值我得到可选22,如果我检查变量是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的任何值都是不正确的,因为如果3 * 3 >= value您的for (var i = 3; i * i < value; i += 2) {永远不会执行。

3),你需要开始在2检查除数,而不是3 16将使用算法(尽管4 & 8不会,因为他们是9下进行!)

1

如果黄金会发生什么情况出现黄金.text是“abc”?会发生什么是转换为Int()将失败。因为它可能失败,所以toInt()不返回一个整数,它返回一个可选的整数。结果是一个整数或什么都不是。当你调用println时,你不打印整数,你打印一个可选的整数。这就是println打印 - 它说“可选22”。它可能会说“空”。

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