ios - 如果在数字之前按下计算器应用程序中的运算符(operator)按钮,则应用程序崩溃

标签 ios swift

我是 swift 新手,我设计了一个计算器应用程序,如果我在输入数字之前按下运算符(operator)按钮,应用程序会崩溃并显示给我

error: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string " == 1"'



我已将所有数字按钮连接到相同的操作功能
import UIKit

class ViewController: UIViewController {


//outlet of the label
@IBOutlet weak var labelOutlet: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

//action for all the digits and the operator buttons

@IBAction func buttons(_ sender: UIButton) {


        labelOutlet.text = labelOutlet.text! + sender.currentTitle!

}

//action for equals to button
@IBAction func tappedEqualsTo(_ sender: UIButton) {

    let result = test(labelOutlet.text!)
    labelOutlet.text = result

}

//action for clear button

@IBAction func clearbuttonPressed(_ sender: Any) {

    labelOutlet.text = ""

}

//action for delete button

@IBAction func deleteButtonPressed(_ sender: UIButton) {

    let name: String = labelOutlet.text!
    let stringLength = labelOutlet.text?.count
    let substringIndex = stringLength! - 1
    labelOutlet.text = (name as NSString).substring(to: substringIndex)
}


//function to pass a string and get the value calculated and the again return value is in string format

func test(_ expressrion: String) -> String{
    var numinString : String!
    if let num = expressrion.calculate() {
         numinString = String(num)
        print("\(expressrion) = \(num)")
    } else {
        print("\(expressrion) = nil")

    }
    return numinString
}

}

为计算输入的字符串而创建的字符串的扩展
extension String {
  private func allNumsToDouble() -> String {

    let symbolsCharSet = ".,"
    let fullCharSet = "0123456789" + symbolsCharSet
    var i = 0
    var result = ""
    var chars = Array(self)
    while i < chars.count {
        if fullCharSet.contains(chars[i]) {
            var numString = String(chars[i])
            i += 1
            loop: while i < chars.count {
                if fullCharSet.contains(chars[i]) {
                    numString += String(chars[i])
                    i += 1
                } else {
                    break loop
                }
            }
            if let num = Double(numString) {
                result += "\(num)"
            } else {
                result += numString
            }
        } else {
            result += String(chars[i])
            i += 1
        }
    }
    return result
}
//calculation of string and value returned as double from this function

func calculate() -> Double? {
    let transformedString = allNumsToDouble()
    let expr = NSExpression(format: transformedString)
    return expr.expressionValue(with: nil, context: nil) as? Double
  }
}

最佳答案

它可能在线上发生:let expr = NSExpression(format: transformedString)因为您的方法 'allNumsToDouble()' 返回“==1 ”,它可能从标签中获得。

此外,您使用强制展开所有代码 labelOutlet.text!如果标签中没有文本,这可能会导致崩溃。

关于ios - 如果在数字之前按下计算器应用程序中的运算符(operator)按钮,则应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56882328/

相关文章:

ios - 如何检测来自 UIWebView 的身份验证质询?

ios - Swift 4 - 为 alpha 和约束设置动画会影响其他组件的 alpha 值

ios - 从侧边栏菜单在 UIWebView 中加载错误的 url

ios - 向 itunesconnect 提交应用内购买总是被拒绝,因为它太旧了 productutil

ios - 如何获取 ScrollView 的contentOffset?

iOS Swift 和 Facebook SDK

ios - 选择器 View Swift

ios - AVFoundation:在 CanAddInput 处切换相机失败

ios - 删除 UIImagePickerController 中的旋转图标?

ios - 在 iOS 上发布时获得接触