Быстрая строка Интерполяция отображается дополнительно?
Когда я использую следующий код и имя 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