2017-06-25 2 views
0

J'ai un projet de calculatrice GPA Je suis sur le point de perfectionner. Je dois empêcher l'utilisateur d'entrer un numéro non flottant malgré que ".123456789" soit le seul caractère autorisé. Par exemple, si un utilisateur entre 2.3. pour une raison quelconque, mon programme se bloque puisque cette "entrée" n'est pas un flottant. J'ai inclus la base de mon code ci-dessous.Eviter un crash à partir d'une période double pendant un CharacterSet restreint

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 

Comment pourrais-je aller sur l'ajout de l'acceptation d'un seul point décimal dans un champ de texte le plus pratique en ce qui concerne la fonction textfield? Ou y a-t-il un moyen plus simple/direct?

Mise à jour 1:

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

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

À moins que je vais sur ce mal, je reçois l'avertissement que « comparaison de la valeur non-option de type « float » à zéro retourne toujours vrai ». J'avais l'impression que si credits1 ou grade1! = Nil, ma valeur numérique est correcte et ne causera pas de crash plus tard.

+0

Si vous voulez éviter les plantages, arrêtez d'utiliser '!'. – rmaddy

+0

Serait-il préférable d'utiliser un? –

+0

Non, il serait préférable d'utiliser la liaison optionnelle au lieu du déballage forcé. – rmaddy

Répondre

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 

    } 

}

Ce code limite les caractères acceptés à "0-9" et permet également une période/point décimal à saisir. Le retour des caractères 0-9 est vu dans la partie else de l'instruction if. Cette réponse a été inspirée de la réponse par Raj dans cette question précédente How can I limit the number of decimal points in a UITextField?.