2017-01-15 5 views
1

4つのuitextfieldの内容を合計するボタンを持つアプリケーションを実装しています。私の問題は、どのようにuitextfieldsが空であるかを知る方法です。複数のuitextフィールドの結果を計算する最良の方法

ボタンを押したときに値がある場合、uitextfieldは無視されないようにしたいと思います。 通常のif文はそのトリックを行いますか?

if(textfield1 is not empty && textfield2 is not empty &&... && textfield4 is not empty) { 

// add them together 

}else if (choose one textfield to check if its empty) { 

// sign the empty textfield to 0 and add the rest 

} else if (choose another textField to check if its empty) { 

// sign the empty textfield to 0 and add the rest 

} 

. 

. 

. 

// end of button block 

私にとっては、この方法は論理的にもプログラム的にも良い方法ではないようです。

このタスクを達成するための最良の方法は何でしょうか?

おかげ

答えて

2

あなたのテキストフィールドが空であるか、有効な値が含まれていない場合も処理するために、オペレータ??を合体nilをを有効に利用することができます。

let value1 = Int(textfield1.text ?? "") ?? 0 
let value2 = Int(textfield2.text ?? "") ?? 0 
let value3 = Int(textfield3.text ?? "") ?? 0 
let value4 = Int(textfield4.text ?? "") ?? 0 
let sum = value1 + value2 + value3 + value4 

しますか、機能的アプローチの場合は、配列リテラルにtextfieldを格納し、flatMapreduceを使用して値を変換し、合計を生成します。

let values = [textfield1, textfield2, textfield3, textfield4].flatMap({$0.text}).flatMap({Int($0)}) 
let sum = values.reduce(0, +) 
1

もう1つの方法は、テキストフィールドを配列に追加してループすることです。これはますます多くのテキストフィールドのために拡大する可能性があります。この例では、小数点を含むことができる値を使用していることを前提にしていますが、Intに対してこれを実行すると同様に機能します。

var textField1 = UITextField() 
var textField2 = UITextField() 
var textField3 = UITextField() 
var textField4 = UITextField() 
var textFields = [UITextField]() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    textFields = [textField1, textField2, textField3, textField4] 
} 

@IBAction func sumButtonPressed(sender: UIButton){ 
    var sum = 0.0 
    for textField in textFields { 
     if let number = Double(textField.text!) { //checks that it is not nil AND a Double 
      sum += number 
     } 
    } 
} 

あなただけ@Adrianが言ったように、あなたはちょうどそれFUNCで変数を初期化することもできます(つまり、単にsumButtonPressedのFUNC中)、一度TextFieldの配列を使用している場合:

@IBAction func sumButtonPressed(sender: UIButton){ 
    let textFields = [textField1, textField2, textField3, textField4] 
    var sum = 0.0 
    for textField in textFields { 
     if let number = Double(textField.text!) { //checks that it is not nil AND a Double 
      sum += number 
     } 
    } 
} 
+0

を使用してこのアプローチでは、textFields配列をsumPressedボタン内のローカル変数として残し、sumPressedを呼び出すときにそれを設定するほうがよい場合があります。 textFields = [textField1、textField2、textField3、textField4] 'をsumPressedの先頭に置いて、どこに何がセットされているかを調べる必要はありません。純粋に文体ですが、確かに読みやすくなります。 – Adrian

+1

@Adrian大丈夫、他の方法を提供するために投稿を編集します。私は彼が "quotientButtonPressed" funcも持っていたいと思っていれば私の方法が良いと思う); –

+0

それは本当です、私はボタンの機能の中に配列を置くので、私のコードに "calculateButton"を持っています。 – user2066392

関連する問題