2014-11-13 18 views
1

我想在這裏做這個教程。我是一個總的初學者,這將是我的第一個iOS應用時期:解包標籤並轉換爲()

http://www.ioscreator.com/tutorials/calculator-tutorial-in-ios8-with-swift

這裏是我的代碼:

進口的UIKit

class ViewController: UIViewController { 

    var isTypingNumber = false 
    var firstNumber = 0 
    var secondNumber = 0 
    var operation = "" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    @IBOutlet weak var calculatorDisplay: UILabel! 

    @IBAction func numberTapped(sender: AnyObject) { 

     var number = sender.currentTitle 

     if isTypingNumber { 
      calculatorDisplay.text = calculatorDisplay.text! + number!! 
     } else { 
      calculatorDisplay.text = number 

      isTypingNumber = true 
     } 
    } 


    @IBAction func calculationTapped(sender: AnyObject) { 

     isTypingNumber = false 

     firstNumber = calculatorDisplay.text?.toInt()! 

     operation = sender.currentTitle!! 
    } 

    @IBAction func equalsTapped(sender: AnyObject) { 
     isTypingNumber = false 
     var result = 0 

     secondNumber = calculatorDisplay.text?.toInt()!! 

     if operation == "+" { 
      result = firstNumber + secondNumber 
     } else if operation == "-" { 
      result = firstNumber - secondNumber 
     } 

     calculatorDisplay.text = "\(result)" 

    } 
} 

這裏是發生了什麼。我得到一個錯誤,說可選類型Int的值?不打開,你的意思是使用!要麼 ?

它提供了通過添加感嘆號來修復它,然後說這是錯誤的,並提供刪除感嘆號。查看截圖:

First error Second error

我主要是瞭解自選以及如何使用它們的概念,但這莫名其妙給我。

回答

8

這很混亂。問題是calculatorDisplay.text?.toInt()!正在使用可選鏈接由於text之後的?可選鏈的結果始終是可選值,即使您通過添加!來打開鏈中的最後一項也是如此。

!在末尾:

calculatorDisplay.text?.toInt()! 

只解開由toInt()返回Int?。爲什麼toInt()返回可選Int?由於字符串可能無法轉換爲Int,所以在這些情況下,toInt()返回nil。例如,"two".toInt()將返回nil

解開的結果,你可以使用括號組整個可選鏈,使!會解開整個鏈條:

secondNumber = (calculatorDisplay.text?.toInt())! 

或刪除可選鏈接通過力展開text!

secondNumber = calculatorDisplay.text!.toInt()! 

但是如果text是這些會崩潰3210或者如果字符串無法轉換爲Int。更好的方式來做到這一點是使用可選結合

if let secondNumber = calculatorDisplay.text?.toInt() { 
    // when we get here, we know `text` wasn't nil and we 
    // know it converted to an Int. At this point secondNumber 
    // is safely unwrapped and ready to use. Its type is Int. 
} 

另一種選擇是使用零合併運算??。如果您想使用默認值時textnil或文本未成功轉換爲Int,那麼你可以做這樣的事情:

let secondNumber = calculatorDisplay.text?.toInt() ?? 0 

這將解開安全如果toInt()創建可選text不是nil並且轉換成功。否則,0將被分配到secondNumber。無論哪種情況,secondNumber都是Int

+0

雖然這是真的問這個問題的人正在使用可選的鏈接,它確實沒有意義,爲什麼toInt()返回一個可選的詮釋。在字符串實例上調用toInt()並不能保證返回一個值,例如,如果用戶寫了「thirty」.toInt()和「30」.toInt()。請考慮優化您的答案以保持點,因爲您的其他建議是現貨和完美的。我個人建議使用可選綁定,因爲零合併返回0可能是一個有效的值,並可能拋出它們的邏輯。 –

+0

不,但是'toInt()'返回一個可選的事實並不能解釋爲什麼'calculatorDisplay.text?.toInt()!'仍然是可選的。那是什麼造成他的麻煩。最後的'!'只展示'toInt()'的結果,但由於文本後面的'?'鏈仍然返回一個可選項。這是我的觀點。 – vacawama

+0

Ack!你是對的,我誤解它認爲整個表達式正在被解開,而只是toInt()。對於那個很抱歉。也經過測試和確認。 –

2

函數toInt()String返回Int?。這意味着它不保證有價值。當你在這個函數的響應中使用!時,你基本上在說「不用擔心,兄弟,它有一個值fo'rell」。

(由Apple Documentation描述的)一個更合適的用法:

if let secondnumber = calculatorDisplay.text?.toInt() { 
    // do your processing. 
}