Swift/개념 & 응용

[Swift] Swift 문법 - 제어문(if, for, while) / guard / switch / where

유정주 2021. 8. 20. 00:10
반응형

안녕하세요. 

 

오늘은 Swift의 제어문과 guard문, switch문, where절에 대해 알아보겠습니다.

다른 언어와 큰 차이점은 없어 쉽게 넘어갈 수 있었습니다.

포스팅도 긴 설명보다는 예제를 통해 알아보는 부분이 많을 것 같네요.

 

그럼 시작하겠습니다.


참고 자료

Apple Swift Document

https://developer.apple.com/documentation/swift

 

해당 포스팅은 Smile Han님의 유튜브 영상을 참고하며 작성하였습니다.

https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA


if - else if - else

조건이 참일 때 if문 안의 코드를 실행하고 아니면 else문을 실행합니다.

else if가 있다면 if가 거짓일 때 else if의 조건을 체크합니다.

 

다른 언어와의 차이점은 if문의 내용이 한 줄일지라도 중괄호를 생략하면 안 됩니다.

생략을 하면 아래와 같이 컴파일 에러가 발생하니 참고해주세요.

var t = 10
if t == 10
	print(t)


for

for - in 반복문입니다.

증가되는 값을 사용하지 않는다면 _ 키워드를 사용하여 단순 반복만 할 수 있습니다.

for _ in 1...5 {
     print("안녕")
}

 

범위에 배열이나 Dictonary를 넣으면 배열의 length만큼 반복됩니다.

let items = ["A", "B", "C"]
for item in items {
     print(item)
} 
// A
// B
// C
let items = ["A": "a", "B": "b", "C": "c"]
for (upper, lower) in items {
     print(upper, lower)
} 
// A a
// B b
// C c

while

while은 특정 조건을 충족할 때까지 반복을 시켜야 하는 상황에서 for문보다 유용하게 사용할 수 있습니다.

var t = 0
while t < 100 {
	t = t + 1
}
print(t) // 100

repeat-while

자바의 do-while문과 동일합니다.

Swift에서도 Swift 1까지는 do-while이었으나

언어의 직관성을 위해 repeat-while로 이름을 바꿨다고 합니다.

반드시 1회는 실행을 하고 조건이 맞으면 추가 반복을 합니다.

var t = 5
repeat {
	t = t-1
	print(t, terminator: "")
} while (t > 0)
//43210

break

특정 타이밍에 반복문을 탈출하고 싶을 때 사용합니다.

다른 언어와 사용법은 동일합니다.


continue

특정 타이밍에 반복문의 상단 시작 위치로 돌아가고 싶을 때 사용합니다.

다른 언어와 사용법은 동일합니다.


guard

guard문은 Swift 2에 도입된 구문입니다.

guard문의 조건이 거짓이면 else 절을 수행합니다.

 

guard문의 else 절에 속한 코드는 현재의 흐름을 나갈 수 있는 return, break, continue, throw 등의 구문을 반드시 포함해야 합니다.

즉, 매번 사용할 수 있는 구문은 아니고 특정 상황(반복문 내부, 함수 내부...)에서만 사용 가능합니다.

func printPrice(name:String, price:Int) {
	guard price > 0 else { //priece가 0 이하이면 else절을 실행한다.
		print("\(name)은 무료입니다.")
		return
	}
	print(name, price) //price가 0보다 크면 guard 이후의 코드를 실행한다.
}
printPrice(name: "Jeong", price: 0)
printPrice(name: "Ju", price: 10)

if-else와 성능상의 차이점은 없습니다.

사용 이유를 찾아보니 guard문을 사용하면 if-else보다 early exit에 대한 가독성이 증가한다는 의견이 있습니다만

이것조차 의견이 갈리는 것 같습니다.

guard문을 사용해보시고 취향에 맞게 사용하시면 될 것 같습니다.


switch-case

Swift의 switch-case문은 각 case문 마지막에 break가 자동으로 들어있습니다.

따라서 개발자가 직접 break를 안 넣어줘도 됩니다.

주의할 점은 case의 body가 empty면 안 됩니다.

var value = 3
switch(value) {
	case 1:
		print("value is 1")
	case 2:
	case 3:
		print("value is 3")
	default:
		print("others")
}

body가 empty면 발생하는 에러

 

다른 조건에서 동일한 코드를 실행해야 한다면 아래 코드처럼 하시면 됩니다.

var value = 3
switch(value) {
	case 1, 2:
		print("value is 1 or 2")
	case 3:
		print("value is 3")
	default:
		print("others")
} // value is 3

 

개발자가 break를 하지 않고 다음 case문을 실행하고 싶을 때가 있습니다.

그럴 때는 fallthrough를 사용하면 됩니다.

var value = 0
switch(value) {
	case 0:
		print("value is 0")
	fallthrough
	case 1:
		print("value is 1")
	default:
		print("others")
}


where

switch-case, if, while, guard, for 등에 조건을 추가하고 싶다면 where 절을 사용하면 됩니다.

switch-case를 예시로 들어보겠습니다.

var value = 7
switch(value) {
	case 0...5 where value % 2 == 0:
		print("0 <= value <= 5 and Even")
	case 6...10 where value % 2 == 0:
		print("6 <= value <= 10 and Even")
	default:
		print("others")
} //others

7은 6과 10 사이의 숫자이지만 짝수가 아니기 때문에 default절을 실행합니다.

이렇게 추가로 조건을 추가하고 싶을 때 where절을 사용하면 됩니다.


오늘은 제어문과 guard, switch-case, where에 대해 알아보았습니다.

난이도가 높지 않아 하나의 포스팅으로 묶어서 양이 꽤 되네요.

자바를 하다 Swift를 하니 비슷한 점도 있고 확실히 편한 점도 있는 것 같습니다.

 

감사합니다!


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형