私は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の場合、数値が問題なく、後でクラッシュすることはないという印象を受けました。
クラッシュを避けるには、 '!'を使用しないでください。 – rmaddy
aを使う方が良いでしょうか? –
いいえ、強制アンラッピングの代わりにオプションのバインディングを使用する方がよいでしょう。 – rmaddy