Reputation: 23
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
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
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
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
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
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