2

I am having issue with this code, learning swift and I cannot understand why.

What I want to do is user enter on two TextField two numbers, click a Button, and then get the result on Label.

I know TextField don't allow Int, but only string and I know there is method to convert string to Int, but it is not working for me.

Here is the code:

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

    }

}
vadian
  • 274,689
  • 30
  • 353
  • 361

5 Answers5

3

why don´t put your code inside of your action

something like this

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

}

I hope this helps you

Reinier Melian
  • 20,519
  • 3
  • 38
  • 55
1

Try the below code:

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)

    }

}
Annie Gupta
  • 2,786
  • 15
  • 23
  • Thank you very much for the help, I was arrived to the solution my own some minutes ago after a day! But right now I solved it practically, but I cannot figure out why put the conversion inside an action instead of outside. Can you please tell me? – Matteo Collina Oct 11 '16 at 19:57
  • Keeping it outside any function would work as a class instance member so firstNumberConv cannot get initialized with firstNumber since firstNumber itself is not available at that moment. – Annie Gupta Oct 11 '16 at 20:09
1

First of all you must put the code into a function.

Second of all, be consistent!

Either you're using the numeric keyboard then go and unwrap the optionals:

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

or you're using the standard keyboard then use optional bindings to check if the user types a non-numeric character:

@IBAction func resultFunction(_ sender: AnyObject) {
   if let firstNumberConv = Int(firstNumber.text), 
      let secondNumberConv = Int(secondNumber.text) {
        resultNumber.text = "\(firstNumberConv + secondNumberConv)"
   }
}
vadian
  • 274,689
  • 30
  • 353
  • 361
  • Thank you very much, you're suggest was appreciated. – Matteo Collina Oct 11 '16 at 20:04
  • Note that using a numeric keyboard doesn't mean it is safe to force-unwrap. The user can still paste non-numeric text into the text field or use an external keyboard. Or this could be on an iPad which has no numeric keypad. Never trust the keyboard. – rmaddy Jun 22 '19 at 23:20
0

Simple misunderstanding in variable usage. The variable "result" is estimated when the ViewController object initiated, not when "resultFunction" is called.

So you could correct this as follows

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

And you should remove all variable definition parts. I mean this part

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

Hope it could work for you. Thanks

0
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

    }

  }

Put your code in viewDidLoad() method or Do this below it will be way better

  func updateNumber(){

  let firstNumberConv = Int(firstNumber.text!)
  let secondNumberConv = Int(secondNumber.text!)
  let result = firstNumberConv! + secondNumberConv!
  resultNumber.text = String(result!)

  }

then call your method

@IBAction func resultFunction(_ sender: AnyObject) {
    updateNumber();
}

Alternatively if you want to convert to Double just change

      Int(firstNumber.text!) to Double(firstNumber.text!)
Malik
  • 921
  • 11
  • 12