Я новичок в программировании Swift с использованием Xcode. Я создал приложение, которое очень похоже на калькулятор в Windows 7 (калькулятор по умолчанию). У меня проблема с кнопкой @IBAction. В Windows 7 калькулятор, каждый номер, который выполняет операциюФункция равна в калькуляторе
как:
2*2 = 4
Это будет результат, и если вы нажмете на кнопку «=» последовательно будет выполнять операцию, а второй вход будет умножаться результат, так что это будет что-то вроде этого.
//WINDOWS 7 CALCULATOR OUTPUT
4 // this is the result
//if user press equals consecutively
4, 8 , 16 , 32 , 64
//and so on, this is how the windows 7 calcu executes the equals button
В моем коде у меня возникла проблема с этим. Когда я нажимаю равный, он будет умножать результат последовательно.
Пример:
//MY CALCULATOR OUTPUT IN XCODE
2 * 2 = 4 //result is four
//If equals is click consecutively the result would be this
4 , 16 , 256 , 65536 // and so on
//so basically it will multiply the result of calculator's result.
Итак, , что я на самом деле стремится здесь иметь тот же/аналогичный результат, что и окна 7 калькулятор. Как я могу выполнить этот метод? Должен ли я объявлять временную переменную, которая будет содержать второй номер ввода?
Это мой код до сих пор:
Я создал класс под названием MyCalculator.swift
МОЯ калькулятор
//
// MyCalculator.swift
// Calculator
//
// Created by
// Anonymous
//
import Foundation
class MyCalculator
{
var memory: Float = 0
var percentnum: Float = 0
var currentNum: Float = 0
var result: Float = 0
var operation: String = ""
var isOperation: Bool = false
var isRepeatOperation: Bool = false
var isNum: Bool = false
func operation (operation:String) -> Float
{
if operation == "+" {
result = result + currentNum
}
else if operation == "-" {
result = result - currentNum
}
else if operation == "*" {
result = result * currentNum
}
else if operation == "/" {
result = result/currentNum
}
return result
}
func percent(percentNum:Float) ->Float
{
let valpercent = percentNum * 0.01
result = result * valpercent
return result
}
func clearAll() {
result = 0
currentNum = 0
isNum = false
}
}
и это мой файл ViewController.swift
ПРОСМОТР КОНТРОЛЛЕРА
//
// ViewController.swift
// Calculator
//
// Created by
// Anonymous
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//Start Calculator
//Declerations
//Label Result: This is where the result is displayed
@IBOutlet weak var lblResult: UILabel!
//Initialization
let calc = MyCalculator() //call the class MyCalculator
//Function for Number Inputs
@IBAction func btnNumInput(sender: AnyObject)
{
let num = sender.currentTitle
if calc.isNum == false
{
lblResult.text = num
calc.isNum = true
}
else
{
lblResult.text = lblResult.text! + num!!
}
calc.isRepeatOperation = false
}
//Function for Equals
@IBAction func btnEquals(sender: AnyObject)
{
calc.currentNum = Float(lblResult.text!)!
lblHistory.text = ""
calc.isNum = false
if calc.operation == "+"
{
calc.result = calc.operation("+")
}
else if calc.operation == "-"
{
calc.result = calc.operation("-")
}
else if calc.operation == "*"
{
calc.result = calc.operation("*")
}
else if calc.operation == "/"
{
calc.result = calc.operation("/")
}
if calc.operation == "/" && calc.currentNum == 0
{
lblResult.text = "Cannot divide by zero"
calc.result = 0
}
else
{
let stringresult = String(format:"%g" , calc.result)
lblResult.text = "\(stringresult)"
calc.isOperation = false
}
}
В верхней части действия 'btnEquals' вы обновляете значение свойства' currentNum' до самого последнего результата. В вашем методе работы в классе MyCalculator вы вычисляете новые результаты как «результат OP currentNum», например. для OP = *, 'results * currentNum ?. Повторное действие «равно» для пользователя приведет к экспоненциальному поведению, которое вы видите, т. Е. 'Result * currentNum' для повторного равного действия« result result ». Если вам требуется поведение калькулятора Windows, вам нужно сохранить «оригинальное» значение «currentNum», если пользователь не вводит новую операцию или новый операнд. – dfri
Операция всегда выполняется с 'result' и' currentNum'. В начале операции 'currentNum' устанавливается в' result'. (2 * 2 = 4 * 4 = 16 * 16 = 256 и т. Д.) Для сохранения правой части операции вам нужна дополнительная переменная 'operand' (2 * 2 = 4 * 2 = 8 * 2 = 16) – vadian
BTW , вы делаете минус для оператора «*». –