【问题标题】:For Calculator in Swift对于 Swift 中的计算器
【发布时间】:2018-11-22 02:46:42
【问题描述】:

只是要警告你,我是 swift 的新手,我仍然习惯于它的工作原理。我一直在努力为这个 Calculator 项目工作。问题是,我需要练习简化代码。

现在,当按下数字按钮时,我将它保存在这样的数组中。

@IBAction func buttonPressed(_ sender: UIButton) {
    if numBtnPressed == true {
    numArray.append(sender.title(for: .normal)!)
    }
 }

所以如果标记为 1 的按钮被按下,它会将 ["1"] 作为字符串存储在空数组 numArray 中

我有一个单独的结构供操作员使用,以备不时之需。

struct calcFuncs {
  var add : String
  var subtract : String
  var divide : String
  var multiply : String
}
  var calc = calcFuncs(add: "+", subtract: "-", divide: "/", multiply: "x")

我试图弄清楚如何拥有一串数字和运算符(例如 1 + 2 x 3 + 4 / 5 + 5)并让编译器保存该计算,然后在按下相等时打印它。我知道我必须找到一种方法来完成计算,即使现在一切都在一个字符串中。我希望它在标签上打印完成的字符串。

我不知道如何从数组中拉出项目,并根据单击的运算符在中间显示一个运算符。 ("[1] (operator) [2] (operator) [3] (operator)") 并让它打印一个总和。

我在想这样的事情,但我知道它很乏味而且可能行不通:

  for 0...1 in index:
      [0] something [1]
      1...2 in index:
      etc etc

我知道这听起来很疯狂,但我很难告诉计算机我想要什么(按下这些按钮时计算一串数字,保存总数,然后在单击相等时打印总数)并将其放入 clean-剪切代码。

任何建议,即使这意味着更改我的所有代码,我们都非常感谢。

【问题讨论】:

    标签: swift operators


    【解决方案1】:

    您有一些好主意,但也许有更简单的方法。此示例使用您可以在 Interface Builder 中设置的按钮的 tag 属性和 NSExpression 类来评估数学。还有很多其他方法可以做到这一点。

    这将遵循标准的运算顺序(例如,在加法和减法之前的乘法和除法)。

    import UIKit
    
    var calculationString = "" // Declare this outside method in view controller
    
    @IBAction func buttonPressed(_ sender: UIButton) {
        // Use the tag property of buttons which can be set in Interface Builder
        // Number buttons can have tag values 0-9
        // Operator buttons can have higher tag numbers (10: "+", 11: "-", 12: "*" 13: "/")
        // Decimal point button tag (14)
        // Calculate or equals button tag (15)
        // Check for tag number
    
        switch sender.tag {
        case 0...9:
            // Numbers
            calculationString.append(String(sender.tag))
        case 10:
            // Add
            calculationString.append("+")
        case 11:
            // Subtract
            calculationString.append("-")
        case 12:
            // Multiply
            calculationString.append("*") // Need to use asterisk for multiply
        case 13:
            // Divide
            calculationString.append("/")
        case 14:
            // Decimal
            calculationString.append(".")
        case 15:
            // Perform calculation
            let expression = NSExpression(format: calculationString)
            let result = expression.expressionValue(with: nil, context: nil) ?? 0
            yourLabel.text = "Result: \(result)" // Or do whatever you need with the result.
        default:
            fatalError("Unknown button tag")
        }
        yourLabel.text = calculationString // Display user input if desired
    }
    

    【讨论】:

    • 这太棒了!谢谢,我一直在疯狂地尝试编写函数和太多的代码来解决这个问题。快速提问,你能解释一下 NSExpression 是做什么的吗?我只是想绝对确定我理解它。 'expressionValue(with: nil, context: nil) 是什么意思? 0' 代表?
    • 没问题! :) 您可以选择使用给定的对象和上下文评估表达式,但这不是必需的。 NSExpression 可以以多种方式使用。更多信息请访问:developer.apple.com/documentation/foundation/…
    【解决方案2】:

    swift 4 计算器

    class ViewController: UIViewController {
    
    
    var numberOnScreen: Double = 0;
    var previousNumber: Double = 0;
    var performingMath = false;
    var operation = 0;
    
    
    
    @IBOutlet weak var label1: UILabel!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    
    
    @IBAction func btn_pressed(_ sender: Any) {
    
    
    
        if performingMath == true {
    
            label1.text = String((sender as AnyObject).tag-1)
    
        numberOnScreen = Double(label1.text!)!
    
        performingMath = false
    
        }
    
        else {
    
            label1.text = label1.text! + String((sender as AnyObject).tag-1)
    
        numberOnScreen = Double(label1.text!)!
    
        }
        }
    
    
    
    
    
    @IBAction func processbtn(_ sender: Any) {
    
    
    
        if label1.text != "" && (sender as AnyObject).tag != 11 && (sender as AnyObject).tag != 16{
    
       // 11= AC (clear) , 16 = equalto(=)   
       // Use tag numbers correctly
    
        previousNumber = Double(label1.text!)!
    
            if (sender as AnyObject).tag == 12 { //Divide
    
        label1.text = "/";
    
        }
    
            if (sender as AnyObject).tag == 13 { //Multiply
    
        label1.text = "x";
    
        }
    
            if (sender as AnyObject).tag == 14 { //Subtract
    
        label1.text = "-";
    
        }
    
            if (sender as AnyObject).tag == 15 { //Add
    
        label1.text = "+";
    
        }
    
            operation = (sender as AnyObject).tag
    
        performingMath = true;
    
        }
    
        else if (sender as AnyObject).tag == 16 {
    
        if operation == 12{ //Divide
    
            label1.text = String(previousNumber / numberOnScreen)
    
        }
    
        else if operation == 13{ //Multiply
    
        label1.text = String(previousNumber * numberOnScreen)
    
        }
    
        else if operation == 14{ //Subtract
    
        label1.text = String(previousNumber - numberOnScreen)
    
        }
    
        else if operation == 15{ //Add
    
        label1.text = String(previousNumber + numberOnScreen)
    
        }
    
        }
    
        else if (sender as AnyObject).tag == 11{
    
        label1.text = ""
    
        previousNumber = 0;
    
        numberOnScreen = 0;
    
        operation = 0;
    
        }
    
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2016-08-13
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多