我正在尝试在这里进行本教程。我是一个初学者,这将是我的第一个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()!
但是,如果
text
是nil
或无法将字符串转换为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合并运算符
??
。如果要在text
为nil
或文本无法成功转换为Int
时使用默认值,则可以执行以下操作:let secondNumber = calculatorDisplay.text?.toInt() ?? 0
如果
toInt()
不是text
并且转换成功,这将安全地解开nil
创建的可选选项。否则,0
将分配给secondNumber
。无论哪种情况,secondNumber
的类型都是Int
。关于ios - 解开标签并将其转换为Int(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26915699/