2014-09-24 65 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.因此,驚歎號會將可選項轉換爲適當的值或崩潰。