English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In this article, you will learn how to use guard statements to control the flow of program execution.
Swift If StatementDescribes how to perform operations based on a specific condition (boolean value). In this article, we will learn the advantages of guard statements over if statements to control program flow and write simpler and cleaner code.
The main use of guard statements is to transfer program control outside of a scope under certain conditions. These statements are similar to if statements that execute statements based on a specific condition (boolean value), but unlike if, guard statements only run when certain conditions are not met.
In addition, the guard statement must exit the scope. Therefore, we must use user program control statements return, break, continue, or throw at the end of the guard statement.
guard expression else { //Statement //Must contain a control statement: return, break, continue, or throw. }
Qui l'espressione è un'espressione booleana (che restituisce true o false).
Se il valore dell'espressione è calcolato come false, viene eseguita la statement guard all'interno del blocco di codice.
Se il valore dell'espressione è calcolato come true, la statement guard all'interno del blocco di codice viene saltata.
Attenzione: la fine della statement guard deve includere un control statement come return, break, continue o throw.
Una statement guard valida semplice è:
guard true else { print("La condizione non è soddisfatta") } print("La condizione è soddisfatta")
Quando si esegue il programma, l'output è:
La condizione è soddisfatta
Nel programma menzionato, guard contiene un valore booleano true (condizione soddisfatta). Poiché la statement guard viene eseguita solo quando la condizione non è soddisfatta, non viene eseguito lo statement all'interno di guard. Questo è il motivo per cui viene eseguito print("La condizione è soddisfatta") e viene visualizzato sullo schermo.La condizione è soddisfattadel motivo.
Ora, cambia la condizione in false:
guard false else { print("La condizione non è soddisfatta") } print("La condizione è soddisfatta")
Nel programma menzionato, il risultato del calcolo della condizione di protezione è false. Pertanto, dovrebbe essere eseguito lo statement print("Condition not met") all'interno di else. Ma riceverai un messaggio di errore:Il corpo di 'guard' non può essere superato, considera l'uso di 'return' o 'throw' per uscire dalla portata.
Il messaggio di errore significa che devi utilizzare statement come return, break, continue o throw per trasferire il controllo del programma dalla statement guard. Ora utilizzeremo return. Poiché il statement return può essere utilizzato solo all'interno di una funzione, impacchettiamo il codice nel contesto di una funzione Swift.
Possiamo utilizzare la statement guard in SwiftAll'interno della funzioneL'uso della statement guard è illustrato di seguito:
func someFunction() { guard false else { print("La condizione non è soddisfatta") return } print("La condizione è soddisfatta") } someFunction() print("Hello viene visualizzato dopo la chiamata della funzione")
当您运行上述程序时,输出将是:
La condizione non è soddisfatta Hello viene visualizzato dopo la chiamata della funzione.
Nel programma menzionato, il risultato del calcolo della condizione guard è false, quindi viene eseguito lo statement interno a guard. La prima statement print("La condizione non è soddisfatta") viene visualizzata nella console.:Condizione non soddisfatta.
E la istruzione return termina l'esecuzione della funzione, mentre la chiamata della funzione print("Hello, after function call") esegue la seguente istruzione dopo la chiamata della funzione e la output viene visualizzata nel terminale:Dopo la chiamata della funzione viene output Hello.
AbbiamoOpzionali in SwiftAbbiamo già visto come utilizzare if-let per decomprimere un Optional. Ma possiamo anche utilizzare l'istruzione guard al posto di if-let per espandere l'espressione opzionale, il che ha un vantaggio. Uno dei principali vantaggi dell'uso di guard rispetto a if-let per espandere variabili opzionali è che possiamo aumentare l'area di validità della decompressione.
Vediamo questo in un esempio sottostante:
func changeOptionalStringToUpperCase() { var name: String? guard let temp = name else { print("Il nome è nil. Non può essere elaborato") return } print("Maiuscolo:\(temp.uppercased())") } changeOptionalStringToUpperCase()
当您运行上述程序时,输出将是:
Il nome è nil. Non può essere elaborato
Nel programma sopra, si può vedere che il valore non avvolto temp viene utilizzato al di fuori dell'area definita dall'istruzione guard. Poiché name è definito come opzionale e contiene un valore nil, l'istruzione guard non può decomprimere questo valore.
Quindi, nelle istruzioni eseguite in guard else, viene stampato "Il nome è nil. Non può essere elaborato" e la funzione termina con l'istruzione return. Il codice equivalente alle istruzioni guard if else è:
func changeOptionalStringToUpperCase() { var name: String? if let temp = name { print("Maiuscolo:\(temp.uppercased())") } print("Il nome è nil. Non può essere elaborato") return } //Come accedere qui? Soluzione: utilizzare Guard } changeOptionalStringToUpperCase()
Attenzione, le due istruzioni precedenti sono valide e completano lo stesso lavoro. Tuttavia, quando si utilizza l'istruzione if-let, non è possibile utilizzare valori non avvolgenti (unwrapped) al di fuori dell'istruzione if-let. Ma usando l'istruzione guard, è possibile utilizzare valori non avvolgenti attraverso una funzione.
Le istruzioni guard possono anche collegare più condizioni, separate da virgola (,). Ecco un esempio:
func changeOptionalStringToUpperCase() { var name: String? = "" guard let temp = name, temp.count > 0 else { print("Il nome è nil o una stringa vuota. Non può essere elaborato") return } print("Uppercased:\(temp.uppercased())") } changeOptionalStringToUpperCase()
当您运行上述程序时,输出将是:
名称为nil或空字符串。无法处理
在上面的程序中,guard语句包含两个条件,以逗号分隔。
第一个条件let temp = name解开了一个可选参数,在我们的实例中,该条件返回true,第二个条件temp.count > 0检查解包后的字符串是否包含超过0个字符,在我们的示例中结果为false。
因此,guard语句内的语句执行语句 print("名称为nil或空字符串。无法处理") ,其输出Name为nil或空字符串。无法在控制台中处理,并使用return语句终止该函数。