Post

Swift 흐름제어

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를 추가하지 않았을 때 경고를 띄어준다

unknown 속성이 없으면 열거형 항목을 추가해도
switch 문에 case _: 처리를 한다면 오류가 나지 않고 컴파일됨
작성자가 추가해야 되는지 모를 수 있다
unknown 속성을 이용하면 열거형 항목을 추가했을 때
switch 문도 추가해야 한다는 경고문 출력

 

 

반복문

 

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)

This post is licensed under CC BY 4.0 by the author.