2016-12-20 31 views
0

這是我寫的第一個真正的應用程序,我不明白爲什麼我在解開可選項時得到這個「無」錯誤。如何調試「解開可選值時用nil致命錯誤」?

在我發佈代碼之前,這裏有一個簡單的費用計算器的概念。

我有兩個文本框(expenseLabel和guestLabel)。在App開始時,兩者都應該是空的。這是第一個問題。如果用戶不小心按下計算按鈕,我得到了以下錯誤:

unexpectedly found nil while unwrapping an Optional value

(它的第一行代碼標誌着我內** ** ......樓下)。

只要用戶輸入數字或應用程序開始時標籤不爲空(例如,我在故事板中輸入數字),這種情況不會發生,但由於某種奇怪的原因,我得到了相同的零當我更新resultLabel.text時,第二行到最後一行出現錯誤(再次在** ... **中標記)。 Xcode中標記該行具有以下額外的信息:

Thread 1: EXC_BAD_INSTRUCTION (code=EXE_I386_INVOP, subcode=0x0)

下面的代碼:

class ViewController: UIViewController { 


@IBOutlet weak var expenseLabel: UITextField! 
@IBOutlet weak var guestLabel: UITextField! 
@IBOutlet weak var resultLabel: UILabel! 

@IBAction func splitButton(_ sender: Any) { 

    let expense = expenseLabel.text 
    let guests = guestLabel.text 

    **var result = Double(expense!)!/Double(guests!)!** 
    result = round(result * 100)/100 

    **resultLabel.text = String(result)** 
    self.view.endEditing(true) 
} 
... 

這其實沒有太大的代碼,但我不明白爲什麼我得到這個錯誤。我甚至嘗試了以下和其他一切之前推出的兩個變量費用和嘉賓:

expense = Double(expenseLabel.text!) ?? 0.0 
guests = Double(guestLabel.text!) ?? 0.0 

我認爲這將有助於消除零纏誤差,但這並沒有正常工作。

我現在覺得很無奈,因爲這不是很多代碼,而且出於某種原因,我沒有看到沒有工作。

+0

我給別人學習斯威夫特的建議是,不要強行拆開包裝(又名使用'!'一個變量名之後),直到你適應了語言之後。強制解開一個值是一個非常明顯的跡象,表明你正在黑客攻擊並且沒有正確執行。改用'if let'或'guard'來提取該值。 – AdamPro13

回答

1

你必須檢查

  • 是在text財產nil
  • (是的text屬性是空的?)
  • 能在text屬性字符串轉換爲Double

在這種情況下,可以省略第二檢查因爲空字符串不能轉換到Double反正嚴格講。

if let expense = expenseLabel.text, // !expense.isEmpty, 
    let expenseValue = Double(expense), 
    let guests = guestLabel.text, // !guests.isEmpty, 
    let guestValue = Double(guests) { 

    let result = round((expenseValue/guestValue) * 100)/100 
    resultLabel.text = String(result) 
} else { 
    resultLabel.text = "Something went wrong" 
} 
+0

謝謝!這非常有幫助! – RjC

+0

你能否用一句話解釋if let語句的工作原理?我試圖理解這一點,並試圖創建自己的,但由於某種原因,我的工作不像現在這樣工作。 – RjC

+0

'如果let'將正確表達式的解包值賦給下面的變量,否則跳過相關'{...}'中的代碼,這是非常基本的Swift東西。 – vadian

相關問題