본문 바로가기

스피드 문법정리

5. Conditional Statements

If Statement

If

조건을 평가한 후 그 값이 참이면 statements를 실행

if condition {
   statements
}

If else

if condition {
   statements
   } else {
     statements
   }

 

If else if

if condition {
   statements
} else if condition {
   statements
} else {
   statements
}

If 문장은 까다로운 문장에서 -> 느슨한 문장으로, 범위가 좁은 문장에서 -> 범위가 넓은 문장으로

Switch

값의 일치 여부에 따라서 실행할 코드를 결정, pattern이나 value 매칭에 자주 사용됨

switch valueExpression {
case pattern:
     statements
case pattern, pattern:
     statements
default:
     statements
}

where의 경우는 첫번째 case의 pattern 이 일치하고 조건을 모두 만족한다면 statements를 실행시킴

switch valueExpression {
case pattern where condition:
     statements
case pattern, pattern:
     statements
default:
     statements
}

Interval Matching

범위를 매칭 시키는 경우 사용

let temperature = -8

switch temperature {
case ..<10:
    print("Cold")
case 11...20:
    print("Cool")
case 21...27:
    print("Warm")
case 28...:
    print("Hot")
default:
    break

Fall through

switch 문장의 case의 일치 여부와 상관없이 나머지 문장을 무조건 실행

let num = 2

switch num {
case 1:
    print("One")
case 2:
    print("Two")
    fallthrough
case 3:
    print("Three")
default:
    break
    
 //  Two, Three

위의 예시에서 만약 fallthrough가 없었다면 Short-circuit Evaluaction (단락 평가)으로 case 2에서 switch 문이 종료되지만 fallthrough는 case일치 여부와 상관없이 나머지 문장을 모두 실행시킴

Value Binding Pattern

매칭시킬 대상을 상수나 변수로 바인딩한 후 case 블록에서 활용, where 절과 자주 같이 사용

case let name:
case var name:
let = a

switch a {
case var x where x > 100:
    x = 200
    print(x)
default:
    break
}

let pt = (1, 2)

switch pt {
case let (x, y):
    print(x, y)
case let (let x, let y):
    print(x, y)
case let (let x, var y):
    print(x, y)
case let (x, _):
    print(x)

Guard

Guard 문이 참이 된다면 다음 문장이 실행되고 만약 Guard문이 거짓이라면 else 문에서 종료됨, else 블록은 필수이며, 대부분 Local Scope에서 사용되고 else 블록은 해당 Local Scope를 중지시킴

guard condition else {
    statements
}

guard optionalBinding else {
    statements
}
func (id : String?) -> Bool {
    guard let id = id else {
        return false
    }
    guard id.count >= 6 else {
        return false
    }
    return true
}

validate(id : nil)          //false
validate(id : "abc")        //false
validate(id : "swiftlang")  //ture  

 

validate(id : nil)는 id = id 가 거짓이기 때문에 else 구문이 실행되고 Guard 문이 종료되고, validate(id : "abc")는 id = id 는 참이나 id.count >= 6이 거짓이므로 else 구문이 실행되고 종료되고 validate(id : "swiftlang")는 두 조건 식다 참이기 때문에 true를 리턴함

If vs Guard

func validateUsingIf() {
    var id : String? = nil

    if let str = id {
        if str.count >=6 {
            print(str)
        }
    }
}

func validateUsingGuard() {
    var id : String? = nil
    
    guard let str = id else { return }
    guard str.count >= 6 else { return }
    
    print(str)
}

 

If Guard
조건이 하나이거나 조건자체가 단순 
바인딩 한 상수를 다른 값을 처리하는 임시값으로 사용
중첩이 많아지면 가독성이 떨어짐
복잡한 조건을 여러개 구현
 바인딩한 상수를 동일한 스코프에서 계속해서 사용할 경우
가독성이 좋음

 

 

'스피드 문법정리' 카테고리의 다른 글

7. Control Transfer Statements, Labeled Statements  (0) 2020.06.12
6. Loop Statements  (0) 2020.06.12
4. Operators  (0) 2020.06.11
3. Data Type, Type Inference, Type Safety, Type Conversion, Type Alias  (0) 2020.06.10
2. Var, Scope  (0) 2020.06.10