ios - 在 Swift 中分配一个值,但它认为它是 nil

标签 ios swift option-type

我正在学习斯坦福 iOS Swift 开发类(class)并且必须使我的 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! = ""
}
}

最佳答案

您的问题是您正在设置 calcView.text"Optional(81.0)" .您需要打开 Double? 的包装那是在newValue set 内部对于 displayValue :

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

因为显示值是 "Optional(81.0)" , NSNumberFormatter无法转换该值,因此它返回 nil .

关于ios - 在 Swift 中分配一个值,但它认为它是 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30062403/

相关文章:

ios - 如何在 App store connect 中批准新版本

ios - 应用缩放变换后重新加载 View 会破坏其中的 UIScrollView 框架

ios - 滑动 UITableViewRowActions 时意外出现分隔线

Jpa @OnetoOne 与 Java8 的关系

java - 使用@Builder 的 lombok 中可选数据成员的默认值是什么?

Spring 中的 Java 8 Optional<?> 验证解包器

ios - ObjectiveC 测试 int 是 long 还是 not/CGFloat 是 float 还是 double

ios - 在 XMPP 框架中在后台发送本地通知

ios - 基于按钮按下 Swift 在 sameTableViewController 中加载数据

swift - Swift 中的接口(interface)模拟用于回调实现