我刚接触编码,现在只是学习。快速的代码,我遇到了障碍,似乎无法弄清楚,所以我一直在斯坦福YouTube频道上快速编码,他们正在做一个计算器。目前我们正试图获得双倍价值。
@IBOutlet weak var display: UILabel!
var userIsInTheMiddleOfTypingANumber = false
@IBAction func appendDigit(sender: UIButton) {
let digit = sender.currentTitle!
if userIsInTheMiddleOfTypingANumber {
display.text = display.text! + digit
} else {
display.text = digit
userIsInTheMiddleOfTypingANumber = true
}
}
var operandStack: Array<Double> = Array<Double>()
@IBAction func enter() {
userIsInTheMiddleOfTypingANumber = false
operandStack.append(displayValue)
print("operandStack = \(operandStack)")
}
var displayValue: Double {
get {
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
// This is my problem and comes back with exc_bad_instruction (code=exc_i387_invop any help would be greatly appreciated on this! thank you for your time!
}
set {
display.text = "\(newValue)"
userIsInTheMiddleOfTypingANumber = false
}
}
答案 0 :(得分:0)
除了Martin R:实际上你有两大问题,两者都与你打开选项有关。
首先是这一行:
@IBOutlet weak var display: UILabel!
问题是! @IBOutlet链接到故事板中的视图。但是根据GUI所处的阶段,可能还有display
尚未存在。所以这应该是一个可选的标记?不!然后你的编译器会抱怨这一行:
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
他会抱怨显示器可能不存在,你不能这样做。您可能会“解决”这样的问题:
return NSNumberFormatter().numberFromString(display!.text!)!.doubleValue
但是如果display
没有准备好,或者NSNumberFormatter不能将字符串转换为数字,这将失败。你永远不会知道为什么。所以停止使用强制解包。但是,您可以使用不同的工具来解决问题。但首先你应该考虑你的问题。你的问题最终不是每个字符串都可以转换为double。所以你必须在某个时候处理这个问题。有无数的可能性。但作为初学者,如果你的代码在可选(可以是nil值)实际为零时会崩溃,那么你可以使用这种模式:
if let thisValueIsNotNil = dontKnowIfItIsNil {
// Do something with thisValueIsNotNil - it is save
}
编辑:IMO在这篇博文中很好地解释了一个机制的核心问题: http://appventure.me/2014/06/13/swift-optionals-made-simple/