我正在尝试在这里进行本教程。我是一个初学者,这将是我的第一个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的值?不解包,您是说要使用!要么 ?

它提供了通过添加感叹号来修复它的功能,然后说错了,并提供了删除感叹号的功能。查看屏幕截图:


我最了解可选选项的概念以及如何使用它们,但这让我感到困惑。

最佳答案

这很混乱。问题是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合并运算符??。如果要在textnil或文本无法成功转换为Int时使用默认值,则可以执行以下操作:
let secondNumber = calculatorDisplay.text?.toInt() ?? 0

如果toInt()不是text并且转换成功,这将安全地解开nil创建的可选选项。否则,0将分配给secondNumber。无论哪种情况,secondNumber的类型都是Int

关于ios - 解开标签并将其转换为Int(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26915699/

10-10 11:36