Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

브래의 슬기로운 코딩 생활

4 - guard문, switch-case문 본문

2 - 겨울방학/Swift 복습

4 - guard문, switch-case문

김브래 2023. 12. 27. 13:48

guard문(조건식이 거짓이면 실행)

guard문은 swift 2에 도입된 구문
guard문은 표현식이 거짓(false)으로 판단될 경우에 수행될 else 절을 반드시 포함해야 함
- else 절에 속한 코드는 현재의 코드 흐름을 빠져 나갈 수 있는 구문(return, break, continue, throw 구문)을 반드시 포함해야 함
- 또는 다른 함수를 else 코드 블록 안에서 호출할 수도 있음
 

guard <불리언 표현식> else {

// 표현식이 거짓일 경우에 실행될 코드

<코드 블록을 빠져 나갈 구문>

}

// 표현식이 참일 경우에 실행되는 코드는 이곳에 위치

 
guard문은 기본적으로 특정 조건에 맞지 않을 경우에 현재의 함수나 반복문에서 빠져 나갈 수 있도록 하는
‘조기 출구(early exit)’ 전략을 제공

 

guard~let의 활용

guard는 return, break, continue, throw 등 제어문 전환 키워드를 쓸 수 있는 상황이라면 사용이 가능
그래서 함수 뿐 아니라 반복문 등 특정 블록 내부에 있으면 사용 가능
물론 함수 내부에 있다면 보통 return을 써서 해당 함수를 조기에 빠져나오는 조기 출구 용도로 사용
실제 앱을 만들다 보면 옵셔널 바인딩 때문에 다중 if~else를 사용해야 하는데, guard~let을 사용하면 다중 루프 없는 훨씬 가독성이 좋은 코드가 가능해서 그런 경우 많이 사용
다음은 while문 안에 guard와 break문을 사용한 경우 // 이렇게 guard문을 활용하지는 않음

var x = 1

while true {

  guard x < 5 else { break }//조건(x<5)이 거짓일 때 실행(break)  

  print(x) //1 2 3 4, 조건(x<5)이 참일 때 실행

  x = x + 1

}

if~let vs. guard~let

func printName(firstName:String, lastName:String?){

 

// if let

 if let lName = lastName {   // lastName nil이 아니면

   print(lName,firstName)

 }

 else {

   print("성이 없네요!")

 }

 

// guard let

 guard let lName = lastName else { // lastName nil이면

   print("성이 없네요!")

   return // early exit

 }

 print(lName,firstName)

}

printName(firstName: "길동", lastName:"")

printName(firstName: "길동", lastName:nil)

 

// 홍 길동
// 홍 길동
// 성이 없네요!
// 성이 없네요!

 

guard문

func multiplyByTen(value: Int?) {

  guard let number = value,  number < 10 else {//조건식(값이 있고 10보다 작은)거짓일 때 실행

     print("수가 없거나 10보다 크다.")                         //거짓 : 값이 없거나 10보다 크면

     return

  }

  print(number*10) //조건식이 참일 때 실행, 주의 : number를 여기서도 사용 가능

}

multiplyByTen(value: 3)   //30

multiplyByTen(value: nil)  

multiplyByTen(value: 20)  

 

guard문은 값을 언래핑(unwrap)하기 위해서 옵셔널 바인딩을 이용하며, 그 값이 10보다 작은지 검사
- 변수가 nil이거나 그 값이 10보다 크면, else 절이 실행되어 에러 메시지가 출력하고 함수에서 빠져 나가도록 return문이 실행
- 10보다 작은 값이면, guard문 아래에 있는 코드가 실행되어 그 값에 10이 곱해진 값이 출력된다. 

 

언래핑된 number 변수를 guard문 밖에 있는 코드가 사용할 수 있다!! 

if문을 이용하여 언래핑된 변수는 그렇게 못함

 

switch-case문

switch 표현식

{

  case match1:

    구문

  case match2:

    구문

  case match3, match4:

    구문

  default:

    구문

} //주의 : case문 마지막에 break가 자동으로 들어 있음

switch-case문 결합하기

여러 가지 다른 경우에 대해서 동일한 코드를 실행해야 할 경우
실행될 공통 코드로 그룹 case 문을 만들 수 있음
 

var value = 3

var days : Int = 0

 

switch(value)

{

case 1,3,5,7,8,10,12:

  print("31 일입니다")

case 4,6,9,11:

  print("30 일입니다")

case 2:

  print("28 or 29 일입니다")

default:

  print("월을 잘못 입력하셨습니다")

}

// 여기서 콤마는 OR

switch-case문에서의 범위 지정 매칭

let num = 25

let count : String

 

switch num {

case 0...9:

 count = "한자리 수"

case 10...99:

 count = "두자리"

case 100...999:

 count = "세자리 수"

default:

 count = "네자리 수 이상"

}

print("\(count)입니다.")

switch-case문으로 변경하기

let weight = 60.0

let height = 170.0

let bmi = weight / (height*height*0.0001) // kg/m*m

var body = ""

 

if bmi >= 40 {

 body = "3단계 비만"

} else if bmi >= 30 && bmi < 40 {

 body = "2단계 비만"

} else if bmi >= 25 && bmi < 30 {

 body = "1단계 비만"

} else if bmi >= 18.5 && bmi < 25 {

 body = "정상"

} else {

 body = "저체중"

}

print("BMI:\(bmi), 판정:\(body)")

switch-case에서 where절 사용하기

where절은 switch case에 부가적인 조건을 추가하기 위하여 사용
값이 속하는 범위뿐만 아니라 그 숫자가 홀수인지 짝수인지도 검사

var temperature = 60


switch (temperature)
{

case 0...49 where temperature % 2 == 0:

  print("Cold and even")

case 50...79 where temperature % 2 == 0:

  print("Warm and even")

case 80...110 where temperature % 2 == 0:

  print("Hot and even")

default:

  print("Temperature out of range or odd")

}

 

where

특정 패턴과 결합하여 조건을 추가

 

var numbers: [Int] = [1, 2, 3, 4, 5]

for num in numbers where num > 3 {

    print(num)

}

 

fallthrough

C/C++, Objective-C와 달리 case문 다음에 break 문을 포함할 필요가 없음
Swift는 일치하는 case문을 만나면 자동으로 빠져나옴
case별로 빠져 나가지 않고 아래로 계속 내려가게 하려면 fallthrough 문 사용

var value = 4

 

switch (value)

{

case 4:

 print("4")

 fallthrough

case 3:

 print("3")

 fallthrough

case 2:

 print("2")

 fallthrough

default:

 print("1")

}