Быстрая строка Интерполяция отображается дополнительно?

Когда я использую следующий код и имя NameTextField будет "Jeffrey" (или любое другое имя)

@IBAction func helloWorldAction(nameTextField: UITextField) {

    nameLabel.text = "Hello, \(nameTextField.text)"

}

nameLabel отображает... Привет, Необязательный ( "Джеффри" )

Но, когда я меняю предыдущий код на включение "!" , например:

@IBAction func helloWorldAction(nameTextField: UITextField) {

    nameLabel.text = "Hello, \(nameTextField.text!)"

}

Код работает так, как ожидалось, и отображает nameLabel.... Привет, Джеффри

Почему "!" требуется, в видеоуроке, который я использовал для создания этой простой программы, он не использовал "!" и программа работала, как ожидалось.

Ответ 1

Опционы должны быть развернуты. Вы должны проверить это или принудительно развернуть, как вы. Представьте, что это необязательный вариант, в котором вы добавляете значение. Прежде чем вы сможете получить к нему доступ, вам нужно его отключить.

if let name = nameTextField.text {
    nameLabel.text = "Hello, \(name)"
}

Ответ 2

Другой альтернативой является использование оператора нулевой коалесценции внутри интерполированной строки для более красивого текста без необходимости if let.

nameLabel.text = "Hello, \(nameTextField.text ?? "")"

Это менее читаемо в этом случае, но если бы было много строк, это могло бы быть предпочтительным.

Ответ 3

Здесь удобное расширение, чтобы развернуть Any? в String.

Установите значение по умолчанию для nil значений.

extension String{
    init(_ any: Any?) {
        self = any == nil ? "My Default Value" : "\(any!)"
    }
}

//Пример

let count = Int? = 3
let index = Int? = nil
String(count)
String(index)

// Output
// 3
// My Default Value