2017-11-10 2 views
1

だから、これは私の操作のためのクラスです:Swiftの電卓アプリを複数の数字にすることはできませんか?

class Calculation { 

var currentNumber: String = "" 
var resultNumber = Int() 
var operationInput = String() 


func operationIdentifier() { 

    if operationInput == "=" { 
     resultNumber = Int(currentNumber)! 
     print("\(resultNumber)") 
    } else if operationInput == "+" { 
     resultNumber += Int(currentNumber)! 
     print("\(resultNumber)") 
    } else if operationInput == "-" { 
     resultNumber -= Int(currentNumber)! 
     print("\(resultNumber)") 
    } else if operationInput == "*" { 
     resultNumber *= Int(currentNumber)! 
     print("\(resultNumber)") 
    } else if operationInput == "/" { 
     resultNumber /= Int(currentNumber)! 
     print("\(resultNumber)") 
    } else { 
     print("Operation does not exist.") 
    } 

    print("\(resultNumber)") 
} 

そして私は番号のタイトルを取得するには、このボタンを取得する場所これは次のとおりです。

@IBAction func numberPressed(_ sender: UIButton) { 

    calculation.currentNumber = (sender.titleLabel?.text!)! 
    calculation.currentNumber.append(<#T##other: String##String#>) 
    //calculation.currentNumber.append((sender.titleLabel?.text)!) This is how I use it to append. 
    calculation.operationIdentifier() 
    resultTextField.text = "\(calculation.currentNumber)" 

} 

に示したようAPPENDコマンドは、文字列のためであります私は前の数字の最後に追加するために使用し、結果は常にいくつかのIntの倍数です。例:5を押すと55を返します。

+0

達成したいことを追加してください。あなたの説明からは分かりません。 – Luzo

+0

@ルージャー私は電卓を書いて​​いますが、ボタンのタイトルから数字を受け取る必要がある部分があります。問題は、1桁の数字しか得られないということです。たとえば、ボタンを23に押すと、2が削除されるので、2と3を返します。 – ciklukylok

答えて

0

numberPressedでは、currentNumberをtから設定していますテキストにラベルを付け、同じ値をもう一度それに追加します。

@IBAction func numberPressed(_ sender: UIButton) { 

    guard let label = sender.titleLabel, let numberString = label.text else{ 
     return 
    } 

    calculation.currentNumber.append(numberString) 

    print("currentNumber = \(calculation.currentNumber)") 

} 

また、なぜあなたはnumberPressedcalculation.operationIdentifier()を呼んでください:それは何かのようにすべきですか?それはoperatorPressedメソッドにはありませんか?

+0

このコマンドは、演算子を押した後に前の数値をクリアしますか?そして、はい、そうです。 – ciklukylok

+0

それをクリアしません。あなたは 'operationIdentifier'メソッドの最後でそれを行うか、Luzoが' operatorPressed'アクションで提案したようにする必要があります –

+0

私はシミュレータで押すたびに2桁の数字を与えています。 – ciklukylok

0

まず、ここで値を上書きしています:calculation.currentNumber = (sender.titleLabel?.text!)!。次に、を押してから現在の番号をクリアする必要があります。

ここで私のコンセプトは(あなたの編集したコード)、あなたはプレイグラウンドで試すことができます。

enum Operator: String { 
    case plus = "+" 
    case minus = "-" 
    case multiply = "*" 
    case divide = "/" 
    case equal = "=" 

} 

class Calculation { 

    var currentNumber: String = "" 
    var resultNumber = Int() 
    var operationInput = String() 

    func recalculate() { 
     if resultNumber == 0 { 
      resultNumber = Int(currentNumber) ?? 0 
      return 
     } 

     guard let sign = Operator(rawValue: operationInput), let number = Int(currentNumber) else { return } 

     switch sign { 
      case .plus: resultNumber += number 
      case .minus: resultNumber -= number 
      case .divide: resultNumber /= number 
      case .multiply: resultNumber *= number 
      case .equal: resultNumber = number 
     } 
    } 

    func operatorPressed(_ op: Operator) { 
     recalculate() 
     operationInput = op.rawValue 
     currentNumber = "" 

     print(resultNumber) 
    } 

    func numberPressed(_ number: String) { 
     currentNumber.append(number) 
    } 
} 

let c = Calculation() 
c.numberPressed("5") 
c.numberPressed("5") 
c.operatorPressed(.plus) 
c.numberPressed("5") 
c.operatorPressed(.multiply) 
c.numberPressed("5") 
c.operatorPressed(.equal) 
c.operatorPressed(.plus) 
c.numberPressed("5") 
c.operatorPressed(.equal) 
+0

ありがとうございますが、私に最後の部分を教えてください。 "c.numberPressed(" 5 ")"の概念は何ですか?テスト専用ですか? – ciklukylok

+0

はい、確かです。それはあなたのコードのために調整するので、それは遊び場で行われました。たぶんあなたは弱点を見つけるでしょう。一般的には避けてください!あなたの関数に適切な名前を付け、enumを使って読みやすくしてください。 – Luzo

+0

PGでは正常に動作しますが、自分のコードと同じ結果が得られます。 – ciklukylok

関連する問題