2017-05-30 30 views
0

我遇到了一個簡單的計算器應用程序的這些代碼行。Unwrap不是可選的變量?

func processOperation (operation: Operation) { 
    if currentOperation != Operation.Empty { 
     if runningNumber != "" { 
      rightValStr = runningNumber 
      runningNumber = "" 

      if currentOperation == Operation.Multiply { 
       result = "\(Double(leftValStr)! * Double(rightValStr)!)" 
      } else if currentOperation == Operation.Divide { 
       result = "\(Double(leftValStr)!/Double(rightValStr)!)" 
      } else if currentOperation == Operation.Subtract { 
       result = "\(Double(leftValStr)! - Double(rightValStr)!)" 
      } else if currentOperation == Operation.Add { 
       result = "\(Double(leftValStr)! + Double(rightValStr)!)" 
      } 

leftValStr被聲明爲var leftValStr = ""

rightValStr也被宣佈爲var rightValStr =""

我想知道使用的目的是什麼 「!」在\(Double(leftValStr)!/Double(rightValStr)!)是嗎? 從我所知道的「!」用於展開可選項。 leftValStr和rightValStr在這裏沒有被聲明爲可選的,那麼爲什麼我們必須解開它們呢?

回答

0

即使leftValStrrightValStr不能自選,你是力量展開Double(leftValStr)Double(rightValStr)和初始化字符串值可以是nil的結果。

例如,您不能使用stackoverflow字符串初始化Double。

如果你想確保此轉換的結果是正確的,你可以使用一個if let避免力展開,例如:

if let leftValDouble = Double(leftValStr) { 
    // do your code 
} else { 
    // handle error 
} 

請記住,如果你強行解開一個nil值,你代碼將崩潰。

+0

所以我應該使用強制解包時結果可以爲空? – Frankie

+0

@Frankie不行,如果結果爲零並強制解包,你的代碼將崩潰。請參閱Apple文檔中的指導,首先介紹如何使用「可選」。 – user3441734

+0

如果你100%確定這些值只會是有效的**數字 - 有條件的是,但如果你讓用戶粘貼一些值或任何其他場景 - 你應該使用例如if if來檢查結果。請記住寫一些單元測試,這是一個完美的用例。 – KlimczakM

0

Double初始化您正在使用是failable初始化,即,它可以創建一個Double或返回nil

雙( 「3」),這裏 「3」 可被轉換成Double,所以它返回對應於3

雙(可選Double值」 abc「),這裏」abc「不能轉換爲Double,所以在這種情況下返回nil

在代碼中,你正在使用雙引號(「」),這也不能轉化爲Double,因此它返回nil

現在,當您的force unwrap a nil值,它將導致運行時異常。

因此,Double(leftValStr)!會導致運行時異常。

正在嘗試使用!訪問不存在的可選值會觸發 運行時錯誤。在使用之前,請務必確保可選值包含非零值,即值爲 !強迫 - 解開其價值。

+0

感謝您的回答@PGDev – Frankie

+0

如果您發現有用的答案,請考慮upvoting。 – PGDev

+0

我有,但因爲我只有不到15名的聲望,所以投票只能記錄下來。對不起:( – Frankie