【问题标题】:Assigning in Swift a value but it thinks its nil在 Swift 中赋值,但它认为它的值为 nil
【发布时间】:2015-07-15 17:51:03
【问题描述】:

我正在关注斯坦福 iOS Swift 开发课程,并且必须将我的 displayValue 设置为可选的 double,我为 displayValue func performOperation 分配了一个值,但是 var displayValue: Double 的 getter?读为 nil,我什至硬编码了 var displayValue: Double?是 81 (示例),但它仍然被读为 nil,有没有人有任何想法? (我不想发布我的整个代码,但如果我遗漏了什么,请告诉我!),谢谢!

编辑:这是我现在的全部代码!

导入 UIKit

class ViewController: UIViewController {
var isThereApoint = true
var openStack = Array<Double?>()
var count = 0

@IBOutlet weak var history: UILabel!
@IBOutlet weak var calcView: UILabel!

var historyStack = Array<String>()
var userIsTyping = false

@IBAction func numberButton(sender: UIButton) {
    let numberButton = sender.currentTitle!
    if calcView.text!.rangeOfString("=") != nil{
        calcView.text! = ""
    }

    if userIsTyping{
        calcView.text! = calcView.text! + numberButton
    }
    else {
        calcView.text! = numberButton
        userIsTyping = true
    }

}

@IBAction func decimalPoint(sender: AnyObject) {
    if isThereApoint == true {
    calcView.text! = calcView.text! + "."
        isThereApoint = false
    }
}

var displayValue: Double? {
    get{
        if NSNumberFormatter().numberFromString(calcView.text!) != nil{
            return NSNumberFormatter().numberFromString(calcView.text!)!.doubleValue

        }
        else {
            println("calc view in getter: \(calcView.text!)")
            return 0
        }
    }
    set{
        calcView.text! = "\(newValue)"
        userIsTyping = false
    }

}

@IBAction func operate(sender: UIButton) {
    let operation = sender.currentTitle!
    switch operation{
    case "×":   performOperation ("×, ", {$0 * $1})
    case "÷":   performOperation ("÷, ",{$1 / $0})
    case "+":   performOperation ("+, ", {$0 + $1})
    case "−":   performOperation ("−, ", {$1 - $0})
    case "√":   performOperation ("√, ", {sqrt($0)})
    case "Cos": performOperation ("Cos, ", {cos($0)})
    case "Sin": performOperation("Sin, ", {sin($0)})
    case "PI":  displayValue! = M_PI
                enter()
    default: break
    }
}

func performOperation(operatorSymbol: String, operation: (Double, Double) -> Double) {
    if openStack.count >= 2 {
        println("\(operatorSymbol)")
        displayValue = operation(openStack.removeLast()!, openStack.removeLast()!)
        println("display value : \(displayValue!)")
        var displayAnswer = displayValue!
        history.text! = history.text! + operatorSymbol
        calcView.text! = "= \(displayAnswer)"
        enter()
        //calcView.text! = "= \(displayAnswer)"
        }
    }

@IBAction func positiveOrNegative(sender: AnyObject) {
    if (calcView.text!.rangeOfString("-") != nil) {
        calcView.text! = dropFirst(calcView.text!)
    }
    else {
        calcView.text! = "-\(calcView.text!)"
    }
}

func performOperation(operatorSymbol: String, operation: Double -> Double) {
    if openStack.count >= 1 {
        displayValue = operation(openStack.removeLast()!)
        var displayAnswer = displayValue!
        history.text! = history.text! + operatorSymbol
        enter()
        calcView.text! = "= \(displayAnswer)"
    }
}

@IBAction func clearButton() {
    history.text! = ""
    for item in openStack{
        openStack.removeLast()
    }
    calcView.text! = ""
}

@IBAction func backspace(sender: AnyObject) {
    if countElements(calcView.text!) > 0 {
        calcView.text! = dropLast(calcView.text!)
    }      
}

@IBAction func enter() {
    isThereApoint = true
    if history.text! == "History"{
        history.text! = ""
    }
        openStack.append(displayValue!)
        var userIsTyping = false
        println("openStack  = \(openStack)")
        history.text! = history.text! + "\(displayValue!)" + ", "
        calcView.text! = ""
}
}

【问题讨论】:

  • 你的代码在哪里分配?
  • displayValue = operation(openStack.removeLast(), openStack.removeLast()) 但它一直返回 nil!
  • openStack 是否包含整数或双精度数?
  • 如果在 getter 中返回之前打印出 NSNumberFormatter().numberFromString(calcView.text!)!.doubleValue 的值会得到什么?
  • 致命错误:在展开可选值时意外发现 nil

标签: ios swift optional


【解决方案1】:

您的问题是您将calcView.text 设置为"Optional(81.0)"。您需要为displayValue 解包newValue 内部的Double? 中的Double? displayValue

set {
    calcView.text = "\(newValue!)"
    userIsTyping = false
}

因为displayValue是"Optional(81.0)"NSNumberFormatter无法转换值,所以返回nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多