페이지

2017년 12월 25일 월요일

5. switch

import Cocoa

var statusCode: Int = 404
var errorString: String = "The request failed:"
switch statusCode {
case 400, 401, 403, 404:
   errorString = "There was something wrong with the request."
   fallthrough
default:
   errorString += " Please review the request and try again."
}

fallthrough라는 제어권 전달문(control transfer statement)
어떤 방향으로 진행되던 실행 흐름을 바꿀 수 있다.
fallthrough 는 현재 case 가 가지고 있는 제어권을 바로 아래 case로 '전달하라'고 switch에 알린다.
다시 말해 statusCode와 일치하는 case에 fallthrough제어권 전달문이 있으면(일반적으로 case 맨 아래 fallthrough를 둠)우선 이 case 코드가 실행되고, 제어권이 현재 case를 '통과하여' 바로 아래 case로 넘어간다. 이 바로 아래 case 는 대조할 값과 일치하든 일치하지 않든 해당 코드가 ㅁ조건 실행된다.

- 구간
valueX...valueY :  대조할 값을 어떤 구간으로 설정

...라는 구간 대조(range matching)

- 값 바인딩


where

튜플과 패턴 대조
statusCode와 errorString은 논리적 연관성을 가지고 있다.
논리적 연관성을 드러낼 수 있도록 한 군데에 저장할 수 있다면 여러모로 유용할 것이다. 튜플(tuple)을 사용하는 이유가 이 때문이다.

튜플은 논리적 연관성이 있는 둘 이상의 값을 한데 묶은 일종의 유한 집합이다. 논리적 연관성의 유무를 판단하는 일은 물론 프로그래머의 몫이다. 튜플을 사용하면 서로 다른 값들이 하나의 복합 값으로 묶이는데, 묶어 놓은 결과는 순서 리스트의 구조를 보인다.


import Cocoa

var satusCode : Int =  418
var errorString: String = "The request failed with the error:"

switch statusCode {
   case 100, 101:
      errorString += " Informational, \(statusCode)."
   case 204;
      errorString += " Successful but no content, 204."
   case 300...307:
      errorString += " Redirection ,  \(statusCode)."
   case 400...417:
      errorString += " Client error, \(statusCode)."
   case 500...505:
      errorString += " Server error, \(statusCode)."
   case let unknownCode where (unknownCode >= 200 && unkonCode < 300)
                                                   ||  unKnownCode > 505:
      errorString = "\(unkownCode) is not known error code."
  default:
      errorString = "Unexpected error encountered."
}

let error = (statusCode, errorString)

튜플요소에 이름 지정하기
let error = (code: statusCode, error: errorString)
error.code
error.error

이렇게 하면 튜플 요소에 그 이름으로, 즉 statusCode는 code로 errorString은 error로 액세스할 수 있다. 오른쪽 사이드바에도 이전과 같은 결과가 출력될 것이다.

튜플을 사용하는 패턴 대조

....
let error = (code: statusCode, eorr: errorString)
error.code
error.error

let firstErrorCode = 404
let secondErrorCode = 200
let erorCodes = (firstErrorCode, secondErrorCode)
switch errorCodes{
case (404, 404):
     print("No items found.")
case (404, _):
     print("First item not found.")
case (_, 404):
     print("Second item not found.")
 default:
     print("All items found.")
}

- switch vs. if/else

.... let age = 25

if case 18...35 = age {
  print("Cool demographic")
}


여러 조건이 담긴 if-case
...
let age = 25
if case 18...35 = age, age >=21 {
    print("In cool demographic and of drinking age")
}





댓글 없음: