Where "where" may be used?

This is by far the most faved/retweeted Swift tip of mine lately:

indeed cool, unexpected and forgettable feature of Swift pattern-matching.

The fact is you can use where keyword in a case label of a switch statement, a catch clause of a do statement, or in the case condition of an if, while, guard, for-in statement, or to define type constraints.

for-in

let arr = [1,2,3,4]  
let dict = [1:"one", 2:"two"]

for num in array where dict[num] != nil {  
    // 1, 2
}

do-catch

enum ResponseError: ErrorType {  
    case HTTP(Int)
}

func errorProne() throws {  
    throw ResponseError.HTTP(404)
}

do {  
    try errorProne()
} catch ResponseError.HTTP(let code) where code >= 400 && code % 2 == 0 {
    print("Bad Request") // match
} catch ResponseError.HTTP(let code) where code >= 500 && code < 600  {
    print("Internal Server Error")
}

while

var mutableArray:[Int]? = []  
while let arr = mutableArray where arr.count < 5 {  
    mutableArray?.append(0) // [0,0,0,0,0]
}

if

let string:String? = "checkmate"

if let str = string where str == "checkmate" {  
    print("game over") // match
} else {
    print("let's play")
}

guard

let string:String? = "checkmate"

guard let str = string where str != "checkmate" else {  
    fatalError("game over") // match
}
print("let's play")  

switch-case

var value = (1,2)  
switch value {  
    case let (x, y) where x == 1:
        // match 1
    break
    case let (x, y) where x / 5 == 1:
        // not-match
    break
    default:
    break
}

type constraint

func genericFunction<S where S: StringLiteralConvertible>(string: S) {  
    print(string)
}

genericFunction("lambada")  

pity though, where keyword is not really described in details by the "The Swift Programming Language` book.

anyway... now it's clear. Gist code is here.

Conclusion

Of course where is part of control flow of Swift program and may be used almost everywhere.