如果数字是素数,我有以下代码可以解决;
@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则为真。
我做错了什么?
由于
答案 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.因此感叹号将可选项转换为适当的值,或转换为崩溃。