2016-07-29 11 views
1

我正在構建計算器的初始方式。目前,代碼無所作爲,只是在用戶點擊它時將數字和Pi打印到計算器的標籤中。將一個零分配給強制解包可選不會使代碼崩潰,爲什麼?

1)澈代碼

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var display: UILabel! = nil //Look Here "(

    var userIsInTheMiddleOfTypeing = false 

    @IBAction func touchDigit(_ sender: UIButton){ 
     let digit = sender.currentTitle! 
     if userIsInTheMiddleOfTypeing { 
      let textCurrentlyInDisplay = display.text! 
      display.text = textCurrentlyInDisplay + digit 
     } else { 
      display.text = digit 
     } 

     userIsInTheMiddleOfTypeing = true 
    } 

    @IBAction func performOperation(_ sender: UIButton) { 
     userIsInTheMiddleOfTypeing = false 
     if let methematicalSymbol = sender.currentTitle { 
      if methematicalSymbol == "π" { 
       display.text = String(M_PI) // M_PI 
      } 
     } 
    }  
} 

2)UI

touchDigit功能被鏈接到所有的數字按鈕,如圖中下圖。所述顯示UILableperformOperaton是PI按鈕

enter image description here

問題:您可能找到的行(該代碼的第三行)UILabel! = nil。我認爲增加一個nil到一個強制解包可選將崩潰的代碼,但它,到目前爲止,代碼工作正常。這是爲什麼?

+1

你爲什麼認爲它會崩潰?所有可選項(包括IUO)都被隱式初始化爲零,所以'var display:UILabel! = nil'和'var display:UILabel!'。 *解包*是什麼可以崩潰... –

+0

@MartinR好了,現在我明白了一點吧 – SLN

+1

另外 - 假設插座連接正確 - 當視圖控制器從Storyboard實例化時,變量將被設置。所以當'touchDigit'被調用時它不再是'nil'。 –

回答

4

解包可選是與編譯器的合同,該值不會是nil當它是訪問。考慮下面的遊樂場代碼。

var x: Int! = nil // It's declared as an unwrapped optional *var* 
x = 5 // So assigning to it is OK 
var y: Int = x // you can access its value, if it's not nil 
x = nil // even assigning nil is OK 
//y = x // CRASH. *Accessing* it when nil causes an error 

在聲明中添加= nil實際上是虛假的 - 如果你放棄了它,變量仍然會初始化爲nil,正如@MartinR在評論中指出,您的出口將被分配到時廈門國際銀行是加載。

+0

非常感謝這個很好的例子,我對這個可選概念非常困惑,需要繼續學習 – SLN

+0

不客氣! – Grimxn

1

當你強迫展開可選

var labelForced: UILabel! = nil 

全部來自正規可選變量

var label: UILabel? = nil 

差異聲明變量是強制解開可選都會盡量含蓄unwrapp時,你會嘗試GET它值()(除非你明確標記安全的解包,例如let text = labelForced?.text)。所有其他行爲是相同的

+0

非常感謝您的幫助「) – SLN

1

當我在第2點看你的UI時,我發現你已經將UILabel連接到故事板中的標籤。那是對的嗎? 如果這是正確的,那麼在聲明UILabel時將其設置爲零時,應用程序不會崩潰。只要視圖生命週期方法運行,聲明的UILabel和初始設置爲零,將連接到故事板中的UILabel。

您可以通過實現視圖生命週期方法來檢查它,並讓它將UILabel打印到控制檯。

+1

是的,您說得對,謝謝你們這麼多人來幫助我「) – SLN