Swift 흐름제어
조건문
if 구문
if 문은 if와 else if, else로 구성되어 있다 if 문에 else if는 몇 개가 있어도 상관없고 else는 없어도 된다
스위프트의 if 문의 조건은 값이 항상 Bool 타입이어야 한다
1
2
3
4
5
6
7
8
9
10
11
let first : Int = 5
let second : Int = 5
if (first > second) { //조건의 소괄호는 선택사항
print("first가 더 큼")
} else if (first < second) {
print("second가 더 큼")
} else {
print("둘이 같다")
}
// 둘이 같다
switch 구문
다른 언어와 달리 내부 case가 모두 끝나면 break를 사용하지 않아도 switch 구문이 끝난다 만약 case를 연속으로 실행하려면 fallthrough 키워드를 사용한다
switch 구문에 다양한 값이 들어갈 수 있다 다만 각 case에 들어갈 비교 값은 입력값과 데이터 타입이 같아야 한다
만약 비교 값이 한정적인 값(열거형 등)이 아니면 defualt 값을 항상 작성해야 한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let integer : Int = 5
switch integer {
case 0 :
print("0")
case 1...10:
print("1~10")
fallthrough //여기서 끝나지 않고 다음 케이스 실행
case Int.min..<0, 101..<Int.max:
print("0미만 100초과") //,로 and
default: //위에 모든 case와 맞지 않으면 실행
print("11 ~ 100")
}
//1~10
//0미만 100초과
열거형 switch 구문
입력 항목이 제한되어 있어 default를 사용하지 않아도 됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
enum School {
case primary, elementary, middle, high, college, university}
let 학력 : School = .university
switch 학력 {
case .primary:
print("최종학력은 유치원입니다")
case .elementary:
print("최종학력은 초등학교입니다")
case .middle:
print("최종학력은 중학교입니다")
case .high:
print("최종학력은 고등학교입니다")
case .college, .university:
print("최종학력은 대학교입니다")
}
//최종학력은 대학교입니다
만약 열거형을 추가하게 된다면 switch 문에서는 그 대비를 해야 한다
열거형의 모든 case를 처리하는 switch 문 형태
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
enum School {
case primary, elementary, middle, high, college, university
}
let 학력 : School = .high
switch 학력 {
case .primary:
print("최종학력은 유치원입니다")
case .elementary:
print("최종학력은 초등학교입니다")
case .middle:
print("최종학력은 중학교입니다")
case .high:
print("최종학력은 고등학교입니다")
case .college, .university:
print("최종학력은 대학교입니다")
case _: //경고 출력 Case will never be executed
print("최종학력을 확인해주세요")
}
//최종학력은 고등학교입니다
위 소스코드의 상태는 열거형 case에 값이 추가하고 그 값으로 실행하면 정상적으로 컴파일된다 switch의 case _:
밑에 부분이 실행되고 경고문은 사라질 것이다
하지만 문법적으로 오류가 없지만 논리적 오류가 발생할 수 있다
이 문제를 방지하기 위해 unknow 속성을 사용할 수 있다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
enum School {
case primary, elementary, middle, high, college, university , graduate
} //마지막에 새로운 case추가
let 학력 : School = .high
switch 학력 { //경고 출력 Switch must be exhaustive 열거형의 모든 항목과 대치되지 않는다
case .primary:
print("최종학력은 유치원입니다")
case .elementary:
print("최종학력은 초등학교입니다")
case .middle:
print("최종학력은 중학교입니다")
case .high:
print("최종학력은 고등학교입니다")
case .college, .university:
print("최종학력은 대학교입니다")
@unknown case _:
print("최종학력을 확인해주세요")
}
//최종학력은 고등학교입니다
unknown 속성을 사용하면 열거형 case는 추가했지만 switch 구문의 case를 추가하지 않았을 때 경고를 띄어준다
반복문
for - in 구문
1
2
3
for 임시상수 in 시퀀스 아이템 {
실행코드
}
컬렉션 타입에서 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let numbers : [Int] = [1,2,3,4]
for i in numbers {
print(i)
}
//1
//2
//3
//4
let friends : [String : Int] = ["min":24,"jun":27,"yung":11]
for (k,j) in friends {
print("이름:\(k) 나이:\(j)")
}
for i in friends {
print(i)
}
//이름:jun 나이:27
//이름:min 나이:24
//이름:yung 나이:11
//(key: "jun", value: 27)
//(key: "min", value: 24)
//(key: "yung", value: 11)
while 구문
조건이 Bool 타입으로 지정돼야 한다 continue와 break 사용 가능하다
1
2
3
4
5
6
7
8
9
10
var friends : [String] = ["min","jun","yung"]
while friends.isEmpty == false {
print("good bye \(friends.removeFirst())") //삭제하고 반환한다
}
//good bye min
//good bye jun
//good bye yung
//모든 요소가 삭제되어 friends.isEmpty가 참이되고 while문은 종료된다
repeat-while 구문
do-while과 같은 사용 용도이다 최초로 먼저 1번 실행하고 반복을 시작한다
1
2
3
4
5
6
7
8
9
var friends : [String] = ["min","jun","yung"]
repeat {
print("good bye \(friends.removeFirst())")
} while friends.isEmpty == false
//good bye min
//good bye jun
//good bye yung
구문 이름표
반복문을 중첩으로 작성하다보면 반복문을 제어하는 continue나 break가 어떤 범위에 적용되야 하는지 헷갈리는 경우가 많다 원하는 반복문을 제어하기 위해 반복문 앞에 이름과 :를 붙여서 반복문 제어를 확실하게 할 수 있다
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
var numbers : [Int] = [3,134,2313,4223,12]
numberLoop: for num in numbers { //전체를 감싸는 for - in문
if num > 5 || num < 1{ //3이 여기 들어오고 조건에 부합하지 않음 아래로 진행
continue numberLoop
}
var count : Int = 0
printloop: while true { //항상 참으로 break가 없으면 무한 반복
print(num) //num에 3이 있으므로 3이 출력
count += 1 //count는 1이 된다
if count == num { //조건에 부합 하지 않음 printLoop반복 총 3번한다 따라서 3이 3번 출력
break printloop //3번 반복하고 탈출
}
}
removeLoop: while true { //항상 참으로 break가 없으면 무한 반복
if numbers.first != num { //처음은 numbers.first == num이므로 조건 성립 안됨
break numberLoop // 두번째 반복에서는 numbers.first = 134이므로 조건 성립 전체루프 탈출
}
numbers.removeFirst() // 3제거
}
}
print(numbers)