2017-06-25 10 views
0

私はGPA電卓プロジェクトを完備しています。唯一許可されている文字「.」にもかかわらず、ユーザーが浮動小数点数を入力するのを防ぐ必要があります。たとえば、ユーザーが2.3を入力した場合。どんな理由であれ、私のプログラムはこの「入力」が浮動小数点ではないのでクラッシュします。私は以下のコードの基盤を含んでいます。それがテキストフィールドの機能に関連して、私が最も実用的にテキストフィールドに一つだけ小数点の受け入れを追加するに行くかどう拘束中にダブルピリオドからのクラッシュを避ける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 

?それとも簡単な方法がありますか?

アップデート1:

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

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

私はこれについてつもりない限り、誤って、私は「nilにタイプの非オプションの値を比較する 『フロート』は常にtrueを返します」という警告を受けています。私は、credit1またはgrade1!= nilの場合、数値が問題なく、後でクラッシュすることはないという印象を受けました。

+0

クラッシュを避けるには、 '!'を使用しないでください。 – rmaddy

+0

aを使う方が良いでしょうか? –

+0

いいえ、強制アンラッピングの代わりにオプションのバインディングを使用する方がよいでしょう。 – rmaddy

答えて

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 

    } 

}

このコードは、「0-9」受け付けた文字を制限し、また、一周期/小数点が入力されることを可能にします。 0〜9文字の戻り値は、ifステートメントのelse部分にあります。この回答は、この前の質問How can I limit the number of decimal points in a UITextField?のRajの答えからインスピレーションを得ました。

関連する問題