앞서 함수를 배웠으니 이쯤되면 등장해야하는 조건문에 대해서 알아보자
1. 조건문 (if, switch, guard)
- 주어진 조건에 따라 명령을 수행하는 문장, 즉 조건의 참과 거짓을 판별하여 참일 때 수행된다.
- Swift 에서의 조건문 : if, switch, guard
하나씩 사용법을 알아보도록 하자
(1) if
swift 의 if문은 다음과 같은 형식으로 써주면 된다.

예제 코드로는 홀수와 짝수 판별식을 만들어보자

if 문의 조건이 성립한다면 즉, 2로 나눈 나머지가 0 이라면 "짝수입니다." 를 출력할 것이고, 그렇지 않다면 (else) 다음 else 구문안의 문장을 출력할 것이다.
따라서 num이 3일때: if 조건문 성립 X -> else 문으로 이동 후 실행
num이 6일때: if 조건문 성립 O, 실행
만약에 조건이 3개 이상이라면? else if 를 사용해주면 된다
myMark
조건 1: 점수가 90 이상이면 A
조건 2: 80-90 사이면 B
조건 3: 둘 다 아니면 C
위 같은 경우는 switch 문으로 하는 게 낫겠지만 좋은 예시가 생각나지 않으니 이걸로 해보자

(2) switch

- switch 는 입력변수에 매칭되는 case 가 실행된다.
- 반복적으로 if, else - if 를 써야되는 상황이라면 switch 문으로 써주는게 가독성이 더 좋고 적합할 때가 있다.
위에서 if 문에서 사용한 myMark를 좀 더 세부화시켜서 switch 구문으로 바꿔보자
myMark
조건 1: 점수가 90-100 사이면 A
조건 2: 80-90 사이면 B
조건 3: 70-80 사이면 C
조건 4: 60-70 사이면 D
조건 5: 60 미만이면 F

mark 가 입력변수이기 때문에 따로 조건에 맞는 case 구문을 실행한다. 사이에 있는 값은 ... 으로 표현한다
하지만 위의 if 조건절처럼 mark > 90 이런식으로 쓸 수 있을까?

바로 다음과 같은 에러가 발생한다. " Expression pattern of type 'Bool' cannot match values f type 'Int' "
위 switch 구문에서 입력변수의 데이터타입은 Int이다.
따라서 매칭되는 case 를 찾기 위해서는 case 조건부분이 같은 Int 이어야 한다는 것이다.
하지만 mark >= 90 이 부분은 참과 거짓으로 판단되는 Bool 타입이기에 다음과 같은 에러가 발생하는 것이다.
그래서 굳이 비교등호가 필요하다면 다음과 같이 써주면되겠다.
오류 해결 - 1번 방법

1번 방법이다. boolean의 case 를 써야된다면, 입력 변수 값을 같은 boolean으로 변경해주면 된다.
switch를 실행시켜야 하기에 당연히 true 를 써주고, 아래 case 수식을 아까 쓰지 못한 등호를 사용하여 완성한다.
하지만 보기에도 좋은 코드는 아닌 듯하니 참고만 하자!
오류 해결 - 2번 방법

입력 변수 타입을 바꾸지 않겠다면 case _ where 을 추천한다.
혹시 sql 을 공부했었던 사람이면 눈치챘겠지만 where 은 뒤에 조건식을 데리고 다닌다. 그래서 데이터베이스에서 특정 데이터 값을 찾을 때 where FirstName = 'Ellie' 이런식으로 필터링해서 조건에 맞는 데이터 값을 찾는 것이다.
이처럼 mark의 조건식(where)이 충족한다면 해당 case 는 실행될 것이다.
(3) guard
- guard 는 우리가 아는 뜻 그대로 무언가를 막는 것이다. 따라서
guard 문은 함수 내에서 입력값의 오류로 프로그램이 종료되는 것을 막기위해 사용해준다.
Q: 그렇다면 잘못된 값일 때의 처리를 어떻게 해줄까?
A: else 구문과 함께 return , throw, break 등 으로 함수의 실행을 막거나 함수를 나가게 하면된다.
그래서 guard - else 는 항상 한 세트로 다니니 기억하도록 하자
guard 예시코드

input 앞에 guard 가 붙어있으므로 해당 함수는 input 이 1 일때만 실행된다.
결과에서 알 수 있듯이 1을 입력하면 함수가 실행이 됐지만, 2를 입력하니 return 되어 결과가 없는 것을 확인할 수 있다.
Q: 보면서 if 같다고 생각하는 사람이 많을 것이다. 둘의 차이는?
A: if와 다른점은 코드블럭의 수행을 막기위해 if는 부정의 조건식을 쓰지만, guard 는 수행에 필요한 조건을 그대로 나타내어 훨씬 가독성이 좋습니다.
Q: 여러식의 조건문을 쓰고 싶을 때는?
A: Guard 문은 쉼표(,)로 구분하여 여러 조건을 쓸 수 있다.
여러식의 조건문을 쓴 간단한 예시 코드는 다음과 같다.
로그인을 하려면 아이디와 비밀번호 두 개의 필드가 입력되어야만 다음으로 진행이 가능하다.
필드값이 비어있지 않은 경우, 즉 != nil일 경우에 guard 문을 붙이고, 비어있을 경우 (else) 에는 return 을 메세지 출력과 함께 return 을 시켜주자.
guard로 사용자 아이디와 비밀번호 필드값 입력 확인하기

따라서 테스트한 부분을 보면 아이디와 비밀번호가 nil 일 때는 결과값으로 else 문의 코드블럭에 있던 "아이디와 비밀번호가 입력되지 않았습니다. " 가 출력이 되고,
아이디와 비밀번호에 문자열을 입력해준 후 실행하면 guard 문을 통과하여 성공적으로 "아이디와 비밀번호가 입력되었습니다. " 가 출력되는 것이다.
오늘의 조건문 끝! 사실 반복문까지 다루고 싶었지만 포스트가 너무 길어질까봐 다음장에서 하도록 하겠다!
'iOS' 카테고리의 다른 글
| Swift 3-2장 반복문 (for-in, while, repeat-while) (0) | 2021.12.28 |
|---|---|
| Swift 2장 - 함수와 매개변수/전달인자 (0) | 2021.12.13 |
| Swift 1장 - Swift와 기본 문법 (데이터타입/상수변수/컬렉션) (0) | 2021.12.09 |