2017-06-25 3 views
0

Ich habe ein GPA-Rechner-Projekt Ich bin nah an der Perfektionierung. Ich muss verhindern, dass der Benutzer eine Nicht-Gleitkommazahl eingibt, obwohl "." die einzigen zulässigen Zeichen sind. Zum Beispiel, wenn ein Benutzer 2.3 eingibt. Aus irgendeinem Grund stürzt mein Programm ab, da diese "Eingabe" kein Float ist. Ich habe die Basis meines Codes unten eingefügt.Vermeiden Sie Absturz während der doppelten Periode während des zurückhaltenden CharacterSet

func textField(_ textField: UITextField, shouldChangeCharactersIn  range: NSRange, replacementString string: String) -> Bool { 

    var allowed = CharacterSet.decimalDigits 
    let period = CharacterSet.init(charactersIn: ".") 
    allowed.formUnion(period) 

    //UNCOMMENT when isSuperset is working 
    //let characterSet = CharacterSet(charactersIn: string) 
    //return allowed.isSuperset(of: characterSet) 

    // Swift 3 appropriate solution 
    let isSuperset = string.rangeOfCharacter(from: allowed.inverted) == nil 
    return isSuperset 
} 


@IBAction func Calculate(_ sender: AnyObject) { 

    // if not filled in 
    if Credits1TF.text == "" || Grade1TF.text == "" || CumCredits.text == "" || CumGPA.text == "" || Credits1TF.text == "." || Grade1TF.text == "." || CumCredits.text == "." || CumGPA.text == "." 
    { 
print...   
}   else 
     { 
      //credits 
      let credit1 = Float(Credits1TF.text!)! 
      //grades 
      let grade1 = Float(Grade1TF.text!)! 
      //math 
      let firstgrade = credit1 * grade1 

Wie würde ich nur gehen über eine Dezimalstelle in einem Textfeld der Akzeptanz der Zugabe meisten praktisch, da es auf die Textfeld-Funktion bezieht? Oder gibt es einen einfacheren/geradlinigeren Weg?

Update 1:

let credit1 = Float(Credits1TF.text!)! 
      if credit1 != nil 
      { 
       let newcredits1 = credit1 

      //grades 
      let grade1 = Float(Grade1TF.text!)! 
       if grade1 != nil 
       { let newgrade1 = grade1 

Wenn ich darüber nicht richtig werde ich die Warnung erhalte, dass „den Vergleich nicht optionale Wert vom Typ‚Float‘auf Null immer true zurückgibt“. Ich hatte den Eindruck, dass, wenn Credits1 oder Note1! = Null sind, mein numerischer Wert in Ordnung ist und später keinen Absturz verursachen wird.

+0

Wenn Sie Abstürze vermeiden möchten, hören Sie auf '!' Zu verwenden. – rmaddy

+0

Wäre es besser, ein zu verwenden? –

+0

Nein, es wäre besser, eine optionale Bindung anstelle einer erzwungenen Entpackung zu verwenden. – rmaddy

Antwort

0
func textField(_ textField: UITextField, shouldChangeCharactersIn  range: NSRange, replacementString string: String) -> Bool { 

    var allowed = CharacterSet.decimalDigits 
    let period = CharacterSet.init(charactersIn: ".") 
    allowed.formUnion(period) 


    if (textField.text?.contains("."))! && string.contains(".") 
    { 
     return false 
    } 
    else 
    { 
     let isSuperset = string.rangeOfCharacter(from: allowed.inverted) == nil 

     return isSuperset 

    } 

}

Dieser Code beschränkt die zulässigen Zeichen auf „0-9“ und ermöglicht auch eine Periode/Dezimalpunkt eingegeben werden. Die Rückgabe der Zeichen 0-9 wird im else-Teil der if-Anweisung angezeigt. Diese Antwort wurde von der Antwort von Raj in dieser vorherigen Frage How can I limit the number of decimal points in a UITextField? inspiriert.

Verwandte Themen