2015-07-14 27 views
11

quando uso il seguente codice e hanno nameTextField essere "Jeffrey" (o qualsiasi altro nome)Visualizzazione interpolazione stringa rapida opzionale?

@IBAction func helloWorldAction(nameTextField: UITextField) { 

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

} 

nameLabel display ... Ciao, opzionale ("Jeffrey")

Ma, quando cambio il codice precedente per includere un "!" in questo modo:

@IBAction func helloWorldAction(nameTextField: UITextField) { 

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

} 

Il codice funziona come previsto e nameLabel mostra .... Ciao, Jeffrey

Perché è il "!" richiesto, nel tutorial video che ho usato per creare questo semplice programma non ha usato il "!" e il programma ha funzionato come previsto.

risposta

10

Le opzioni devono essere scartate. È necessario controllarlo o forzarlo come si fa. Immagina l'opzionale come una scatola in cui inserisci un valore. Prima che tu possa accedervi, devi metterlo fuori.

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

Perfetto, grazie! –

+14

Questa sembra una scelta di design terribile dai creatori di Swif per l'interpolazione delle stringhe. Non conosco nessun altro linguaggio che faccia questo. È più sensato stampare il valore da scartare se esiste, altrimenti stampare in bianco o zero. Oppure non consentire gli optionals all'interno dell'interpolazione di stringhe. Questo ha causato tonnellate di bug per noi. – bobics

14

Un'altra alternativa consiste nell'utilizzare l'operatore null coalescenza all'interno della stringa interpolata per testo più bella senza la necessità di if let.

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

In questo caso è meno leggibile, ma se ci fossero molte stringhe potrebbe essere preferibile.

+0

Ogni volta che lo uso, quadruplica il tempo di costruzione. –

+0

Sfortunatamente, nel mio caso sto provando a interpolare i valori facoltativi di Int, non posso fondere con una stringa vuota. – RonLugge

+0

@RonLugge No ma è possibile con uno zero :-) –