In Swift 2, there is a new keyword for handling the control-flow of a block of code. It guarantees, that a specific condition holds true for the further code. Otherwise, it ensures that the following code will not be executed.
Let us start with a simple example. Imagine you have a function, that has an optional as an argument:
|
func testItOld(a: Int?) { if let a = a { print("a: (a)") } else { print("not ok") } } |
Because
a is an optional, you need to check whether
a is nil or not.
In this situation, guard gives you a simpler possibility:
|
func testItWithGuard(a: Int?) { guard let a = a else { print("not ok") return } print("a: (a)") } |
In the guard condition, there is conditional binding of
a . If it fails, the else part of the guard statement must ensure that the following code will not be executed. In this case, the function is returned.
After the guard statement,
a is not an optional anymore, which makes the handling of optionals easier then before.
Generally, the guard statement can be used everywhere, where one of the following statements can be called:
|
return, break, continue, throw |
If none of these keywords are called, there will be a compiler error!
So you can for example ensure, that a condition holds for a loop iteration:
|
var numbers: [Int?] = [1,2,3,nil,5] for a in numbers { guard let a = a else { continue } print("value (a)") } |
Another good application case is throwing an error. Our previous example can be rewritten to
|
enum anErrorType: ErrorType { case numberNotValid } func testItWithGuard(a: Int?) throws { guard let a = a else { print("not ok") throw anErrorType.numberNotValid } print("a: (a)") } |