SWIFT_꼼꼼한 재은씨 문법편
반복문(Loop) 목차
For 반복문
- 횟수에 의한 반복
for ~ in {...}in키워드를 사용해서 정해진 횟수만큼 주어진 코드블록을 반복해서 실행- 정의된 루프상수는 for ~ in구문에서만 사용
1 | for <루프상수> in <순회 대상> { |
- 순회대상: 순번을 가지는 집단 자료형 또는 범위 (배열, 딕셔너리, 집합, 범위데이터, 문자열)
- 루프상수: 순회대상이 포함하고있는 개별아이템들을 차례로 넘겨받아 임의저장. 자동재선언
- 실행구문: for루프에 의해 반복 실행될 구문의 범위
1 | for row in 1...5 { |
구구단 만들기
1 | for row in 1...9 { |
1992~2019년
1 | for year in 1992...2019 { |
루프상수가 필요하지 않을 경우
- 그위치에 변수나 상수가 필요하지만 나한텐 필요가없어
1 | let size = 5 |
결과: 공공공공공칠
다중루프 & 이중루프(구구단 예제)
- 바깥루프는 1
9까지 순회 안쪽도 마찬가지로 19까지 순회 - 바깥 루프가 순회할 때마다 루프 상수 i 에는 1
9까지 차례로 대입, 안쪽 루프가 순회할 때마다 j에도 19까지 차례로 대입
1 | for i in 1...9 { |
While 반복문
- 조건에 의한 반복
while 구문
- 주어진 조건이 false가 될 때까지 계속 반복
- for~in 구문은 while 구문으로 쉽게 변경이 가능하지만 반대는 쉽지 않음
- 조건을 만족하는 동안은 계속 실행
- 반복횟수를 예측하기 어려운 조건에서 사용
- 매번 시작할때 조건을 평가해서 루프를 돌지말지 결정
- 처음부터 거짓이면 실행 X
- 직접 실행해보기 전까지는 실행 횟수를 결코 알 수 없을 때
1 | while <조건> { |
- 조건은 반드시 True & False 결과로 반환해야한다.
- 결과가 true인경우엔 코드가 반복해서 수행하지만 false경우 그즉시 종료되고 다음 구문을 실행하게 된다.
n을 2배씩 증가시키다 1000보다 커지는 순간 중지
1 | var n = 2 |
무한루프
- 조건대신 true를 넣으면 한없이 반복 실행되는 무한루프 탄생
- 코드를 탈출할 수 있는 break 를 넣어주지 않으면 영원히 반복
- 액션, 이벤트에 의해 동작하는 모바일 앱은 사용자의 액션을 기다리는 동안 입력 대기상태를 유지하는데, 앱이 종료되지 않은 채로 대기상테를 유지하기 위해 이벤트루프라고 불리는 무한루프를 만들어 실행한다.
1 | while true { |
repeat~while 구문
- 일단 주어진 코드를 실행하고 다음에 다시 실행할지 말지를 조건을 통해 평가
- 조건이 거짓이라도 최소 한 번은 실행
1 | repeat { |
- n이 1000이 되기전까지 2를 했을때 (repeat~while, while의 값이 달라짐)
1 | //while만 사용한경우 |
조건문
if 구문
- 조건식의 평과 결과가 참(true)일때만 코드 블록 내부의 구문을 실행하고, 거짓(false)이라면 코드블록을 빠져나가 다음 코드를 수행한다.
1 | if <조건식> { |
- 조건문은 반드시 Bool타입의 참, 거짓을 판단할 수 있는 형태의 구문이여야 한다.
1 | var c = 18 |
if~else
1 | if <조건식> { |
- if 구문과 함께 사용되어 조건식의 결과가 참이 아닐때에만 해당 블록을 실행함.
1 | var c = 18 |
if 구문의 중첩
- if 구문은 중첩해서 사용이 가능하다.
1 | var c = 18 |
if~else if
1 | if <조건1> { |
- else if 구문은 여러번 사용이 가능하다. 비교해야 할 값이 여러개일 때 사용하기 좋다.
- Else 구문은 앞에서 진행된 if~else if 구문들의 조건에서 어느것도 속하지 않았을 때 실행되어야 하므로 항상 맨 마지막에 위치해야 한다.
guard 구문
- 주어진 표현식의 결과가 참인지 거짓인지에 따라 구문의 실행 여부를 결정짓는 방식의 조건문이다.
- if 구문과 차이는 guard구문에는 else가 필수이지만 결과가 참일 때 실행되는 블록이 없다는 점이다.
1 | guard <조건식 또는 표현식> else { |
- 코드가 실행되기 전 특정조건을 만족하는지 확인하는 용도로 사용된다.
- guard구문의 else블록 이후엔 코드진행을 막아주는 구문이 반드시 포함되어야 하는데 return 또는 break구문이 이에 해당한다.
1 | func divide(base: Int) { |
switch 구문
- 입력받은 값을 조건식 여부가 아니라 패턴으로 비교하고 그 결과를 바탕으로 실행 블록을 결정하는 조건문
- 나열된 패턴들을 순서대로 비교하다가 일치하는 첫 번째 패턴의 코드 블록을 실행한다.
1 | switch <비교대상> { |
- 비교대상과 패턴이 일치할 경우 그에 해당하는 구문이 실행된 후 나머지 case에 대한 비교 없이 switch구문을 종료하고, swithch 구문 다음에 나오는 실행블록으로 진행한다.
- 어느 패턴과도 일치하지 않았다면, 맨 마지막 default구문의 코드가 실행된다.
- 일치하는 패턴이 여러개이더라도 맨 처음 일치하는 case구문 하나만 실행한다.
- fallthrough
- fallthrough 가 사용된 case블록은 비교패턴이 일치할 경우 인접한 case블록으로 실행흐름을 전달한다.
- fallthrough에 의해 실행흐름을 전달받은 case블록은 비교패턴의 일치 여부와 상관 없이 작성된 구문을 실행한 후 switch구문을 종료한다.
1 | var value = (2, 3) |
결과: 튜플의 두 벚째 값이 3일때 첫번째 값은 2이다
- swich구문에서 튜플 내부의 아이템이 비교 대상과 부분적으로 일치할 경우 스위프트 case구문의 비교 패턴 전체가 일치하는 것으로 간주한다.
- 일치하지 않는 나머지 부분을 상수나 변수화 하여 사용할 수 있다.
1 | var passtime = 1957 |
- 범위 연산을 사용하여 해당범위에 속하는 값을 매칭한다.
1 | var value1 = (2, 3) |
- 튜플의 경우 아래와 같이 원소별로 범위 연산자를 이용한 범위를 사용하여 비교가 가능하다.
1 | var point = (3, -3) |
제어전달문
break
- switch 구문에선실행 흐름이나 반복 실행 중인 루프를 조건식 결과에 상관없이 즉각적으로 종료하는데 사용
- 반복문 에서는 반복 실행 블록에 사용되어 조건식이 false를 반환하기 전에 미리 반복문을 종료하는 역할을 한다.
- 반복문내에서 실행시 반복문의 전체실행을 즉시 종료하고 마지막에 위치한 닫는 중괄호 다음의 첫 번째 코드 줄로 실행흐름을 전달한다.
- for~in 구문에서는 남은 아이템의 순회를 더이상 진행하지 않고 반복문을 종료한다.
continue
- 구문 아래에 있는 실행 구문들을 건너뛰고 다음 반복을 시작하는 역할을 한다.
- continue구문 이후 실행할 내용이 남았더라도 실행되지 않는것은 break와 같지만, break구문은 반복문이 완전히 종료하는 것과는 달리 continue구문은 아래에 있는 나머지를 실행하지 않을 뿐, 전체 반복은 유지된다.
1 | var text = "This is a swift book for Apple's programming language" |
결과: This_is_a_swift_bOOk_fOr_Apple's_prOgramming_language
구문레이블
- Break, continue구문이 어떤 구문을 멈추거나 다시 시작하게 할지 명확하지 않을때! 명확하게 표현해 줄 필요가 있다.
- 반복문이나 조건문 등 특정 구문에 레이블을 붙여 기억할 수 있도록 하고 Break, continue 구문이 사용될 때 레이블을 명시해 줌으로써 해당 위치에 정확히 흐름제어가 적용할 수 있도록 문법을 제공한다.
1 | <레이블이름> : while <조건식> { |
1 | // 1에서 5까지 반복 |
결과: 1 X 1 = 1, 1 X 2 = 2
- 바깥루프, 안쪽루프에 레이블을 지정해준 다음 이를 활용해서 안쪽 루프에서 break outer를 호출하면 바깥까지 모두 종료가된다.




