2016-05-26 13 views
2

Hier ist der Code für meine UIButtonWie kann ich meinen Rechner einen Zeitraum in swift hinzufügen?

@IBAction private func performOperation(sender: UIButton) { 
    if userIsInTheMiddleOfTyping { 
     brain.setOperand(displayValue) 
     userIsInTheMiddleOfTyping = false 
    } 
    if let mathematicalSymbol = sender.currentTitle { 
     brain.performOperation(mathematicalSymbol) 
    } 
    displayValue = brain.result 
} 

Hier ist mein Modell oder Viewcontroller Code

private var operations: Dictionary<String,Operation> = [ 
    "π": Operation.Constant(M_PI), 
    "e": Operation.Constant(M_E), 
    "√": Operation.UnaryOperation(sqrt), 
    "cos": Operation.UnaryOperation(cos), 
    "✕": Operation.BinaryOperation({ $0 * $1 }), 
    "÷": Operation.BinaryOperation({ $0/$1 }), 
    "+": Operation.BinaryOperation({ $0 + $1 }), 
    "−": Operation.BinaryOperation({ $0 - $1 }), 
    "±": Operation.UnaryOperation({ -$0 }), 
    "=": Operation.Equals, 
    ".": Operation.Period 
] 

private enum Operation { 
    case Constant(Double) 
    case UnaryOperation((Double) -> Double) 
    case BinaryOperation((Double, Double) -> Double) 
    case Equals 
    case Period 
} 

func performOperation (symbol: String) { 
    if let operation = operations[symbol] { 
     switch operation { 
     case .Constant(let associatedConstantValue): 
      accumulator = associatedConstantValue 
      break 
     case .UnaryOperation(let associatedFunction): 
      accumulator = associatedFunction(accumulator) 
      break 
     case .BinaryOperation(let associatedFunction): 
      executePendingBinaryOperation() 
      pending = PendingBinaryOperationInfo(binaryFunction: associatedFunction, firstOperand: accumulator) 
      break 
     case .Equals: 
      executePendingBinaryOperation() 
      break 
     case .Period: 
      displayTextContainsPeriod() 
      break 
     } 
    } 
} 

private func displayTextContainsPeriod() -> Bool 
{ 

} 

Ich weiß, wenn eine vorhandene Zeit zu überprüfen existiert ich überprüfen müssen, wenn der String einen Teilstring enthält " . " aber ich bin nicht sicher, wie man den Anzeigetext in meinem func erhält displayTextContainsPeriod

Antwort

3

Sie haben den falschen Ansatz gewählt. Die . sollte kein Operator sein. Ihr Rechner Gehirn sollte nicht beteiligt sein. Diese Arbeit sollte in Ihrem ViewController durchgeführt werden, nicht in Ihrem Modell. Es sollte wie die Ziffern funktionieren und das Zeichen . an die Zeichenfolge display anhängen, wenn die display nicht bereits eine . enthält.

Sie sollten über den Fall nachdenken, wenn . eingegeben wird und der Benutzer nicht gerade dabei ist, eine Nummer einzugeben. Vielleicht möchten Sie Ihre Anzeige mit 0. statt nur . zum Beispiel starten.

+0

Sie haben Ihren Kommentar unter der falschen Antwort gepostet. Das Gehirn sollte nicht an der Eingabe der Nummer beteiligt sein. Es ist nur zum Berechnen. Sie rufen das Gehirn nicht für jede eingegebene Ziffer an. Ebenso würden Sie das Gehirn nicht anrufen, wenn ein Dezimalpunkt eingegeben wird. Hängen Sie einfach das '.' Zeichen an die Anzeigezeichenfolge an, nachdem Sie sichergestellt haben, dass Sie noch keine haben. – vacawama

2

Angenommen, der Anzeigetext ist in einem UITextField und das Sie es in einem Storyboard bauten (wenn nicht, aktualisieren Sie die Frage).

Sie benötigen einen Zugang zum Controller

@IBOutlet var displayTextField: UITextField! 

Dann hinzuzufügen, schließen Sie es in Ihrem Storyboard auf das Feld.

In Ihrem Code können Sie sich auf self.displayTextField.text beziehen, um den aktuellen Text im UITextField abzurufen.

+0

Hmm Ich dachte der Job des Modells war festzustellen, ob der Text gültig ist oder nicht. Wenn jemand also 1.0.0.0.0.0.0.0 drückt, ignoriert das Modell einfach alle "." nach dem 1. "." –

+0

Welches Modell redest du? –

+0

Was wäre das Modell in einer Taschenrechner-App? –

1

Hier ist meine Funktion touchDigit (danke @vacawama), vielleicht ein bisschen chaotisch. Als Anfänger hoffe, einen nützlichen Rat zu bekommen. :)

@IBAction private func touchDigit(sender: UIButton) { 
    let digit = sender.currentTitle! 
    if userIsInTheMiddleOfTyping{ 
     let textCurrentlyInDisplay = display.text! 
     display.text = (digit == "." && textCurrentlyInDisplay.rangeOfString(".") != nil) ? textCurrentlyInDisplay : textCurrentlyInDisplay + digit 

    }else{ 
     display.text = (digit == ".") ? "0." : digit 
    } 
    userIsInTheMiddleOfTyping = true 
} 
Verwandte Themen