我在这里尝试做这个教程。我是初学者,这将是我的第一个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的值?没打开,你的意思是用!还是?
它提供了通过添加感叹号来修复它,然后说错了,并提供删除感叹号。见截图:
我主要理解选项的概念以及如何使用它们,但这对我来说是令人困惑的。
答案 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()!
但如果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 coalescing operator ??
。如果您想在text
为nil
时使用默认值,或者如果文字未成功转换为Int
,则可以执行以下操作:
let secondNumber = calculatorDisplay.text?.toInt() ?? 0
如果toInt()
不是text
并且转换成功,这将安全地展开由nil
创建的可选项。否则,0
将被分配到secondNumber
。在任何一种情况下,secondNumber
都是Int
类型。
答案 1 :(得分:2)
toInt()
的{{1}}函数返回String
。这意味着它不能保证具有值。当你对这个函数的响应使用Int?
时,你基本上是在说'不,不要担心,兄弟;它有一个值得回报的地方。
更合适的用法(如Apple Documentation所述):
!