2015-07-14 3 views
11

Когда я использую следующий код и nameTextField быть «Джеффри» (или любое другое имя)Быстрое изменение интерполяции строк?

@IBAction func helloWorldAction(nameTextField: UITextField) { 

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

} 

nameLabel отображает ... Здравствуйте, опционный («Джеффри»)

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

@IBAction func helloWorldAction(nameTextField: UITextField) { 

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

} 

код работает, как ожидалось, и nameLabel показывает .... Здравствуйте, Jeffrey

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

ответ

10

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

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

Отлично, спасибо! –

+14

Это кажется ужасным выбором дизайна создателями Swif для интерполяции строк. Я не знаю другого языка, который делает это. Имеет смысл напечатать развернутое значение, если оно существует, в противном случае напечатать пустое или ноль. Или не допускайте опций внутри интерполяции строк. Это вызвало массу ошибок у нас. – bobics

14

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

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

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

+0

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

+0

К сожалению, в моем случае я пытаюсь интерполировать дополнительные значения Int - не может сливаться с пустой строкой. – RonLugge

+0

@RonLugge Нет, но вы можете с нулем :-) –

Смежные вопросы