Matteo Collina
Matteo Collina

Reputation: 23

Convert UITextField in Int or Double

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

    }

}

Upvotes: 2

Views: 7742

Answers (5)

Reinier Melian
Reinier Melian

Reputation: 20804

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

Upvotes: 3

Malik
Malik

Reputation: 947

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!)

Upvotes: 0

vadian
vadian

Reputation: 285069

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)"
   }
}

Upvotes: 1

user6184877
user6184877

Reputation:

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

Upvotes: 0

Annie Gupta
Annie Gupta

Reputation: 2822

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)

    }

}

Upvotes: 1

Related Questions