CS193P 作业 1 π
CS193P Assignment 1 π
我正在 iTunesU 学习 CS193P 课程。我有一个与第一个作业相关的问题 - 可编程计算器。我试图按照讲座和家庭作业中的描述添加 π 按钮。但是,按 π 键后跟 enter 或和操作数会导致崩溃并显示消息:"fatal error: unexpectedly found nil while unwrapping an Optional value"
class CalculatorBrain
{
private enum Op {
case Operand(Double)
case NullaryOperation(String, () -> Double)
case UnaryOperation(String, Double -> Double)
case BinaryOperation(String, (Double,Double) -> Double)
var description: String{
get {
switch self {
case .Operand(let operand): return "\(operand)"
case .NullaryOperation(let symbol, _): return symbol
case .UnaryOperation(let symbol, _): return symbol
case .BinaryOperation(let symbol,_):return symbol
}
}
}
}
private var opStack = [Op]()
private var knownOps = [String:Op]() //initialize dictionary
init() {
func learnOp (op: Op) {
knownOps[op.description] = op
}
learnOp(Op.BinaryOperation("×", *))
learnOp(Op.BinaryOperation("÷", { / [=10=] }))
learnOp(Op.BinaryOperation("+", +))
learnOp(Op.BinaryOperation("−", { - [=10=] }))
learnOp(Op.UnaryOperation("√", sqrt))
learnOp(Op.UnaryOperation("sin", sin))
learnOp(Op.UnaryOperation("cos", cos))
learnOp(Op.NullaryOperation("π", { M_PI }))
}
我已经能够在视图控制器中强制执行它,但知道这是一个 hack:
var displayValue: Double{
get{
// I don't understand why I had to put this hack in for π
// if (calcDisplay.text != "π"){
return NSNumberFormatter().numberFromString(calcDisplay.text!)!.doubleValue
// } else {
// return M_PI
// }
}
set{
calcDisplay.text = "\(newValue)"
userIsInTheMiddleOfTyping = false
}
}
我是 Swift / Obj-C 的新手。有人可以帮我指出正确的方向来解决这个问题吗?
NSNumberFormatter().numberFromString
旨在将数字字符串转换为数字。 "numerical string" 是一个字符串,其内容的形式为:
([:digit:]+(\.[:digit:]*)?)|(\.[:digit:]+)
其中 [:digit:]
是数字集 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
.
本质上,它只会解析字符在 0-9
和可选的 .
.
内的字符串中的数字
因为 π
不属于这组 10 个字符,它被拒绝并且 NSNumberFormatter
无法从字符串中解析数字。
我正在做同样的课程,但由于我还没有到分离我的 MVC 的地步(将在下一个作业中这样做),所以我只能给你一个提示,告诉你哪里出了问题。因为它对我有用....
您的 hack 正在测试 calcDisplay.text 为“π”,但此时 calcDisplay.text 应该已经是 3,14159。
这就是我在工作任务中用 println 检查的结果。
所以我可以向您展示我的代码中尚不适合 MVC 的部分:
case "cos": performOperation{cos([=10=])}
case "∏": performConstant(operation)
func performOperation (operation: (Double) -> Double) {
if operandStack.count >= 1 {
displayValue = operation(operandStack.removeLast())
enter()
}
}
func performConstant (symbol: (String)) {
switch symbol {
case "∏": displayValue = M_PI
default: break
}
display.text = "\(displayValue)"
enter()
}
我认为它也可以更优化,但它可能会帮助您找到代码中的错误。
我也在做同样的课程。我确实解决了“。”和 "pie" 个问题。看看这是否对你有帮助。
@IBAction func appendDigit(sender: UIButton) {
let digit = sender.currentTitle!
if digit == "." {
if (display.text!.rangeOfString(".") == nil) {
display.text = display.text! + "."
} else {
//Don't display anything
}
} else if digit == "∏" {
displayValue = pie
} else {
if userIsInTheMiddleOfTypingANumber {
display.text = display.text! + digit
} else {
display.text = digit
userIsInTheMiddleOfTypingANumber = true
}
}
}
@IBAction func appendPi(sender: UIButton) {
let x = M_PI
if userIsInTheMiddleOfTypingANumber {
displayValue = x
display.text = "\(displayValue)"
}else {
displayValue = x
userIsInTheMiddleOfTypingANumber = true
enter()
}
}
为 PI 创建了一个与其他函数分开的新 UIButton 函数。为我工作,试试吧。
我正在 iTunesU 学习 CS193P 课程。我有一个与第一个作业相关的问题 - 可编程计算器。我试图按照讲座和家庭作业中的描述添加 π 按钮。但是,按 π 键后跟 enter 或和操作数会导致崩溃并显示消息:"fatal error: unexpectedly found nil while unwrapping an Optional value"
class CalculatorBrain
{
private enum Op {
case Operand(Double)
case NullaryOperation(String, () -> Double)
case UnaryOperation(String, Double -> Double)
case BinaryOperation(String, (Double,Double) -> Double)
var description: String{
get {
switch self {
case .Operand(let operand): return "\(operand)"
case .NullaryOperation(let symbol, _): return symbol
case .UnaryOperation(let symbol, _): return symbol
case .BinaryOperation(let symbol,_):return symbol
}
}
}
}
private var opStack = [Op]()
private var knownOps = [String:Op]() //initialize dictionary
init() {
func learnOp (op: Op) {
knownOps[op.description] = op
}
learnOp(Op.BinaryOperation("×", *))
learnOp(Op.BinaryOperation("÷", { / [=10=] }))
learnOp(Op.BinaryOperation("+", +))
learnOp(Op.BinaryOperation("−", { - [=10=] }))
learnOp(Op.UnaryOperation("√", sqrt))
learnOp(Op.UnaryOperation("sin", sin))
learnOp(Op.UnaryOperation("cos", cos))
learnOp(Op.NullaryOperation("π", { M_PI }))
}
我已经能够在视图控制器中强制执行它,但知道这是一个 hack:
var displayValue: Double{
get{
// I don't understand why I had to put this hack in for π
// if (calcDisplay.text != "π"){
return NSNumberFormatter().numberFromString(calcDisplay.text!)!.doubleValue
// } else {
// return M_PI
// }
}
set{
calcDisplay.text = "\(newValue)"
userIsInTheMiddleOfTyping = false
}
}
我是 Swift / Obj-C 的新手。有人可以帮我指出正确的方向来解决这个问题吗?
NSNumberFormatter().numberFromString
旨在将数字字符串转换为数字。 "numerical string" 是一个字符串,其内容的形式为:
([:digit:]+(\.[:digit:]*)?)|(\.[:digit:]+)
其中 [:digit:]
是数字集 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
.
本质上,它只会解析字符在 0-9
和可选的 .
.
因为 π
不属于这组 10 个字符,它被拒绝并且 NSNumberFormatter
无法从字符串中解析数字。
我正在做同样的课程,但由于我还没有到分离我的 MVC 的地步(将在下一个作业中这样做),所以我只能给你一个提示,告诉你哪里出了问题。因为它对我有用....
您的 hack 正在测试 calcDisplay.text 为“π”,但此时 calcDisplay.text 应该已经是 3,14159。 这就是我在工作任务中用 println 检查的结果。
所以我可以向您展示我的代码中尚不适合 MVC 的部分:
case "cos": performOperation{cos([=10=])}
case "∏": performConstant(operation)
func performOperation (operation: (Double) -> Double) {
if operandStack.count >= 1 {
displayValue = operation(operandStack.removeLast())
enter()
}
}
func performConstant (symbol: (String)) {
switch symbol {
case "∏": displayValue = M_PI
default: break
}
display.text = "\(displayValue)"
enter()
}
我认为它也可以更优化,但它可能会帮助您找到代码中的错误。
我也在做同样的课程。我确实解决了“。”和 "pie" 个问题。看看这是否对你有帮助。
@IBAction func appendDigit(sender: UIButton) {
let digit = sender.currentTitle!
if digit == "." {
if (display.text!.rangeOfString(".") == nil) {
display.text = display.text! + "."
} else {
//Don't display anything
}
} else if digit == "∏" {
displayValue = pie
} else {
if userIsInTheMiddleOfTypingANumber {
display.text = display.text! + digit
} else {
display.text = digit
userIsInTheMiddleOfTypingANumber = true
}
}
}
@IBAction func appendPi(sender: UIButton) {
let x = M_PI
if userIsInTheMiddleOfTypingANumber {
displayValue = x
display.text = "\(displayValue)"
}else {
displayValue = x
userIsInTheMiddleOfTypingANumber = true
enter()
}
}
为 PI 创建了一个与其他函数分开的新 UIButton 函数。为我工作,试试吧。