DaniSDE
DaniSDE

Reputation: 111

Why is Optional("Text") - Swift

I just started with Swift. So I created a simple application with a label, button and a text field. When you click the button, the app has to change the label with the text of the text field.

class ViewController: UIViewController {
    @IBOutlet weak var textLabel: UILabel!
    @IBOutlet weak var textField: UITextField!

    @IBAction func updateButton(sender: UIButton) {
        textLabel.text = "Hi \(textField.text) "
    }

The result is

Hi Optional("TextOfTextField")

Okay. So it's a very simple question.

I hope someone can help me.

enter image description here

Upvotes: 1

Views: 14382

Answers (6)

Super Developer
Super Developer

Reputation: 897

Using (if let) or (guard let) you can unwrap the value

if let text = textField.text {
    textField.text = "Hi \(text)"
}

guard let text = textField.text else { return }
textField.text = "Hi \(text)"

Upvotes: -1

Payam Khaninejad
Payam Khaninejad

Reputation: 7996

In my case for Swift 4.x, I unwrapped by using below command for option Int? values or Optional list cont:

\(topics?.count ?? 0 )

Upvotes: 0

LinusG.
LinusG.

Reputation: 28892

So the problem here is that the textField's text is an optional, that you have to unwrap for using it.

Just add an ! to textField.text like this:

textLabel.text = "Hi \(textField.text!)"

Your output will now be Hi TextOfTextField


You have a few safer options to unwrap your optionals:

  1. nil coalescing operator: ??
    This will use either textField.text, or, if that's nil, use the other value provided, "?" in this case

    textLabel.text = "Hi \(textField.text ?? "?")"
    
  2. if let statement:
    Note that this will only update your text field's text, if it's not nil. You could provide an else statement to deal with that.

    if let text = textField.text {
        textField.text = "Hi \(text)"
    }
    
  3. guard let statement:
    This works similarly like the if let statement, except that your function will end after the statement.

    guard let text = textField.text else { return }
    textField.text = "Hi \(text)"
    

Hope this helps :)

Upvotes: 12

Celil Bozkurt
Celil Bozkurt

Reputation: 1783

I solved this problem with this for Swift 3;

self.label.text = "\(transaction.amount!)"

Upvotes: -2

Abhishek Jain
Abhishek Jain

Reputation: 888

One more way can be to use Guard to check if it is not nil.

guard let nameText = textField.text else {
    print("break if nil")
    return
}
textLabel.text = "Hi \(nameText!)" 

Using guard makes sure your app fails early if the condition fails.

Upvotes: 1

ElmerCat
ElmerCat

Reputation: 3155

The text of your textField is an optional value because a text field can sometimes be empty. So, use an if let to unwrap the variable and make sure it's not nil — otherwise your program could crash:

if let text: String = textField.text {
   textLabel.text = text
}

Upvotes: 14

Related Questions