2016-10-11 16 views
1

私はこのコードに問題があり、素早く習得しています。理由を理解できません。UITextFieldをIntまたはDoubleに変換してください。

私がしたいことは、2つのTextFieldの2つの数字を入力し、ボタンをクリックして、その結果をLabelで取得することです。

私はTextFieldがIntを許可していないことを知っていますが、文字列のみと、文字列をIntに変換するメソッドがありますが、それは私のためには機能しません。ここで

はコードです:

import UIKit 

class ViewController: UIViewController { 


    @IBOutlet weak var firstNumber: UITextField! 
    @IBOutlet weak var secondNumber: UITextField! 
    @IBOutlet weak var resultButton: UIButton! 
    @IBOutlet weak var resultNumber: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 


    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    var firstNumberConv :Int? = Int(firstNumber.text) 
    var secondNumberConv :Int? = Int(secondNumber.text) 
    var result = firstNumberConv + secondNumberConv 

    @IBAction func resultFunction(_ sender: AnyObject) { 
     resultNumber.text = result 

    } 

} 
+1

http://stackoverflow.com/a/34294660/2303865 –

+0

http://stackoverflow.com/a/29783546/2303865 –

答えて

2

私はこれがあなたに

+0

私は非常にあなたのhelp.Thankあなたを見たとき、私は自分のソリューションを書いていました多く。 –

+0

私はアクション内で文字列をIntに変換する必要がある理由を理解できません。 –

+0

あなたは大歓迎です! –

2

に役立ちます願っています。この

@IBAction func resultFunction(_ sender: AnyObject) { 
    let firstNumberConv :Int? = Int(firstNumber.text!) 
    let secondNumberConv :Int? = Int(secondNumber.text!) 
    let result = firstNumberConv! + secondNumberConv! 
    resultNumber.text = String(result) 

} 

のような理由ドントあなたの行動の中にコードを置く

何か以下のコードを試してください:

class ViewController: UIViewController { 


    @IBOutlet weak var firstNumber: UITextField! 
    @IBOutlet weak var secondNumber: UITextField! 
    @IBOutlet weak var resultButton: UIButton! 
    @IBOutlet weak var resultNumber: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    @IBAction func resultFunction(_ sender: AnyObject) { 

     let firstNumberConv :Int? = Int(firstNumber.text!) 
     let secondNumberConv :Int? = Int(secondNumber.text!) 
     let result = firstNumberConv! + secondNumberConv! 

     resultNumber.text = String(result) 

    } 

} 
+0

非常に助けていただきありがとうございます、私は数分前に私のソリューションに到着しました!しかし、今私はそれを実際に解決しましたが、なぜ変換を外にではなくアクションの中に置くのか分かりません。私に教えてもらえますか? –

+0

ファンクションの外に置くと、クラスインスタンスメンバーとして機能します。firstNumber自体は使用できないため、firstNumberConvはfirstNumberで初期化できません。 –

0

可変利用の単純な誤解。 変数 "result"は、 "resultFunction"が呼び出されたときではなく、ViewControllerオブジェクトが開始されたときに推定されます。

ので

@IBAction func resultFunction(_ sender: AnyObject) { 
    let firstNumberConv = Int(firstNumber.text) ?? 0 
    let secondNumberConv = Int(secondNumber.text) ?? 0 
    let result = firstNumberConv + secondNumberConv 
    resultNumber.text = "\(result)" 
} 

を次のようにこれを修正することができそして、あなたはすべての変数定義部分を削除する必要があります。私はこの部分を意味する

var firstNumberConv :Int? = Int(firstNumber.text) 
var secondNumberConv :Int? = Int(secondNumber.text) 
var result = firstNumberConv + secondNumberConv 

あなたのために働くことを望みます。 ありがとう

+0

ありがとうございました。 –

1

まずはにする必要があります。

第二に、一貫性があります。

どちらかが数字キーボードを使用している、その後optionalsを行くとアンラップ:

@IBAction func resultFunction(_ sender: AnyObject) { 
    let firstNumberConv = Int(firstNumber.text)! 
    let secondNumberConv = Int(secondNumber.text)! 
    resultNumber.text = "\(firstNumberConv + secondNumberConv)" 
} 

か、標準のキーボードを使用しているし、ユーザーがタイプ非数値文字かどうかを確認するには、オプションのバインディングを使用します。

@IBAction func resultFunction(_ sender: AnyObject) { 
    if let firstNumberConv = Int(firstNumber.text), 
     let secondNumberConv = Int(secondNumber.text) { 
     resultNumber.text = "\(firstNumberConv + secondNumberConv)" 
    } 
} 
+0

大変ありがとうございます。 –

関連する問題