展开标签并转换为Int()

时间:2014-11-13 18:15:26

标签: ios swift optional

我在这里尝试做这个教程。我是初学者,这将是我的第一个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

我主要理解选项的概念以及如何使用它们,但这对我来说是令人困惑的。

2 个答案:

答案 0 :(得分:8)

这令人困惑。问题是由于calculatorDisplay.text?.toInt()!之后的? text正在使用可选链接可选链的结果始终是可选值,即使您通过添加!打开链中的最后一项也是如此。

结尾处的!

calculatorDisplay.text?.toInt()!

仅展开Int?返回的toInt()。为什么toInt()会返回可选的Int?由于该字符串可能无法转换为Int,因此toInt()会在这些情况下返回nil。例如,"two".toInt()将返回nil

要打开结果,您可以使用括号对整个可选链进行分组,以便!打开整个链:

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

或通过强制解包 text !删除可选链接

secondNumber = calculatorDisplay.text!.toInt()!

但如果textnil或字符串无法转换为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.
}

另一种选择是使用 nil coalescing operator ??。如果您想在textnil时使用默认值,或者如果文字未成功转换为Int,则可以执行以下操作:

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

如果toInt()不是text并且转换成功,这将安全地展开由nil创建的可选项。否则,0将被分配到secondNumber。在任何一种情况下,secondNumber都是Int类型。

答案 1 :(得分:2)

toInt()的{​​{1}}函数返回String。这意味着它不能保证具有值。当你对这个函数的响应使用Int?时,你基本上是在说'不,不要担心,兄弟;它有一个值得回报的地方。

更合适的用法(如Apple Documentation所述):

!