if <조건1> { <조건1이 참일 때 실행할 구문> } elseif <조건2> { <조건2이 참일 때 실행할 구문> } else { <앞의 조건들이 전부 만족하지 않았을 때 실행할 구문> }
else if 구문은 여러번 사용이 가능하다. 비교해야 할 값이 여러개일 때 사용하기 좋다.
Else 구문은 앞에서 진행된 if~else if 구문들의 조건에서 어느것도 속하지 않았을 때 실행되어야 하므로 항상 맨 마지막에 위치해야 한다.
guard 구문
주어진 표현식의 결과가 참인지 거짓인지에 따라 구문의 실행 여부를 결정짓는 방식의 조건문이다.
if 구문과 차이는 guard구문에는 else가 필수이지만 결과가 참일 때 실행되는 블록이 없다는 점이다.
1 2 3 4
guard <조건식 또는 표현식> else { <조건식 또는 표현식의 결과가 false일 때 실행될 코드> return <함수의 실행을 종료하기 때문에 거의반드시 쓰임> }
코드가 실행되기 전 특정조건을 만족하는지 확인하는 용도로 사용된다.
guard구문의 else블록 이후엔 코드진행을 막아주는 구문이 반드시 포함되어야 하는데 return 또는 break구문이 이에 해당한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
funcdivide(base: Int) { guard base != 0else { // 같음이 아닐때 참 print("연산불가") return } guard base > 0else { // (base != 0) 이 참일때 넘어옴 print("base는 0보다 커야한다.") return } guard base < 100else { print("base는 100보다 작아야 한다.") return } let result = (100/base) print(result) }
switch 구문
입력받은 값을 조건식 여부가 아니라 패턴으로 비교하고 그 결과를 바탕으로 실행 블록을 결정하는 조건문
나열된 패턴들을 순서대로 비교하다가 일치하는 첫 번째 패턴의 코드 블록을 실행한다.
1 2 3 4 5 6 7 8
switch <비교대상> { case <pattenrn1>: <패턴 1이 일치했을 때 실행할 구문> case <pattern2>, pattern3>: <패턴 2, 3이 일치했을 때 실행할 구문> default: <어느 비교 패턴과도 일치하지 않았을 때 실행할 구문> }
비교대상과 패턴이 일치할 경우 그에 해당하는 구문이 실행된 후 나머지 case에 대한 비교 없이 switch구문을 종료하고, swithch 구문 다음에 나오는 실행블록으로 진행한다.
어느 패턴과도 일치하지 않았다면, 맨 마지막 default구문의 코드가 실행된다.
일치하는 패턴이 여러개이더라도 맨 처음 일치하는 case구문 하나만 실행한다.
fallthrough
fallthrough 가 사용된 case블록은 비교패턴이 일치할 경우 인접한 case블록으로 실행흐름을 전달한다.
fallthrough에 의해 실행흐름을 전달받은 case블록은 비교패턴의 일치 여부와 상관 없이 작성된 구문을 실행한 후 switch구문을 종료한다.
1 2 3 4 5 6 7 8 9 10
var value = (2, 3)
switch value { caselet (x, 3): print("튜플의 두번째 값이 3일때 첫 번째 값은 \(x)이다") caselet (3, y): print("튜플의 첫번째 값이 3일때 두 번째 값은 \(y)이다") caselet (x, y): print("튜플의 값은 각각 \(x), \(y)이다") }
결과: 튜플의 두 벚째 값이 3일때 첫번째 값은 2이다
swich구문에서 튜플 내부의 아이템이 비교 대상과 부분적으로 일치할 경우 스위프트 case구문의 비교 패턴 전체가 일치하는 것으로 간주한다.
일치하지 않는 나머지 부분을 상수나 변수화 하여 사용할 수 있다.
1 2 3 4 5 6 7 8 9 10 11
var passtime = 1957 switch passtime { case0..<60 : print("방 금 작성된 글이다") case60..<3600 : print("조 금 전 작성된 글이다") case3600..<86400 : print("얼마 전에 작성된 글이다") default : print("예전에 작성된 글이다") }
범위 연산을 사용하여 해당범위에 속하는 값을 매칭한다.
1 2 3 4 5 6 7 8 9 10 11
var value1 = (2, 3) switch value1 { case (0..<2, 3) : print("범위 A에 포함되었습니다.") case (2..<5, 0..<3) : print("범위 B에 포함되었습니다") case (2..<5, 3..<5) : print("범위 C에 포함되었습니다") default : print("범위 D에 포함되었습니다") }
튜플의 경우 아래와 같이 원소별로 범위 연산자를 이용한 범위를 사용하여 비교가 가능하다.
1 2 3 4 5 6 7 8 9 10
var point = (3, -3)
switch point { caselet (x, y) where x == y: print("\(x)과 \(y)은 x==y 선 상에 있습니다") caselet (x, y) where x == -y: print("\(x)과 \(y)은 x==-y 선 상에 있습니다") case (x, y) : print("\(x)과 \(y)은 일반 좌표상에 있습니다") }
제어전달문
break
switch 구문에선실행 흐름이나 반복 실행 중인 루프를 조건식 결과에 상관없이 즉각적으로 종료하는데 사용
반복문 에서는 반복 실행 블록에 사용되어 조건식이 false를 반환하기 전에 미리 반복문을 종료하는 역할을 한다.
반복문내에서 실행시 반복문의 전체실행을 즉시 종료하고 마지막에 위치한 닫는 중괄호 다음의 첫 번째 코드 줄로 실행흐름을 전달한다.
for~in 구문에서는 남은 아이템의 순회를 더이상 진행하지 않고 반복문을 종료한다.
continue
구문 아래에 있는 실행 구문들을 건너뛰고 다음 반복을 시작하는 역할을 한다.
continue구문 이후 실행할 내용이 남았더라도 실행되지 않는것은 break와 같지만, break구문은 반복문이 완전히 종료하는 것과는 달리 continue구문은 아래에 있는 나머지를 실행하지 않을 뿐, 전체 반복은 유지된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var text = "This is a swift book for Apple's programming language" var result1 = ""
for char in text.self { if char == " " { result1.append(Character("_")) continue } elseif char == "o" { result1.append(Character("O")) continue } result1.append(char) } print(result1)