🐦 Swift

[Swift] 흐름제어

dev_zoe 2023. 3. 14. 15:35
반응형

본 포스팅은 '스위프트 프로그래밍 (3판) - 야곰 저' 도서와 앨런 Swift 문법 마스터스쿨 강의를 공부하며 정리하는 포스팅입니다.

혹시 틀린 부분이 있거나 질문이 있으시다면 언제든지 댓글 달아주시면 정말 감사하겠습니다 :)


1. switch 구문

- break 키워드 사용은 선택 사항이나, 케이스에서 실행하려는 코드가 없을 때 break 문을 반드시 사용해야함

- 입력값은 정수/부동소수 뿐만 아니라 문자, 문자열, 열거형, 튜플, 범위 등 대부분의 타입에 사용할 수 있음

- 케이스를 콤마로 연결 가능하며, switch 문에서는 또는(or)의 의미

 

1) 기본 switch 문

//1. 기본 switch 문

switch 입력값 {
    case 비교값 1:
    	실행구문 //break는 선택사항
    case 비교값 2:
    	실행구문
        fallthrough //이번 case를 마치고, 조건에 부합하지 않더라도 바로 다음 case 실행하는 명령어
    case 비교값 3, 비교값 4, 비교값 5: //switch문에서는 or의 의미
    	실행 구문
    default: // 위 케이스 외의 다른 모든 케이스
    	실행 구문
}
// 2. fallthrough를 사용한 예시

let input = 5 

switch input {
	case 1...10:
    	print("value == 1~10")
        fallthrough
    case Int.min..<0, 101..<Int.max:
    	print("Value < 0 or Value > 100")
    default:
    	break
}


//결과
//value == 1~10
//Value < 0 or Value > 100 //fallthrough가 있으므로 그 다음 case가 조건에 맞지않더라도 바로 실행됨
// 3. where 문을 활용한 switch문
// x 상수에 바인딩 한 후, where 조건절에서 조건에 해당하는지에 대한 여부 확인

let num = 4
switch num{
    case let x where x%2 == 0:
    	print("\(x)는 짝수")
    default:
    	print("\(x)는 홀수")
}

 

2) tuple을 사용한 switch 문

typealias NameAge = (name:String, age: Int)

let tupleValue: NameAge = ("yuri", 99)

switch tupleValue {
case ("yuri", 50):
	print("맞췄습니다!")
case ("yuri", _):
	print("이름만 맞았습니다. 나이는 \(tupleValue.age)" 입니다.")
case (_, 99):
	print("나이만 맞았습니다. 이름은 \(tupleValue.name)입니다.")
    
// 이름만 맞았습니다. 나이는 99입니다.

- 하지만 위의 경우, case문에서 생략된 속성을 바로 가져올 수 없다는 단점이 있으므로 let을 사용한 값 바인딩을 사용하여 해결

typealias NameAge = (name:String, age: Int)

let tupleValue: NameAge = ("yuri", 99)

switch tupleValue {
case ("yuri", 50):
	print("맞췄습니다!")
case ("yuri", let age):
	print("이름만 맞았습니다. 나이는 \(age)" 입니다.")
case (let name, 99):
	print("나이만 맞았습니다. 이름은 \(name)입니다.")
    
// 이름만 맞았습니다. 나이는 99입니다.

 

3) 열거형을 사용한 switch 문

enum School {
	case elementary, middle, high, university, graduate
}

let 최종학력: School = .university

switch 최종학력 {
    case .elementary:
    	print("최종학력은 초등학교입니다")
    case .middle:
    	print("최종학력은 중학교입니다")
    case .high:
    	print("최종학력은 고등학교입니다")
    case .university:
    	print("최종학력은 대학교입니다")
    case .graduate:
    	print("최종학력은 대학원입니다")
}

//최종학력은 대학교입니다

 

4) switch문 패턴매칭

switch age{
	case 10...19:
    case 20..<30:
    default:
}

 

2. for-in 구문

for 임시상수 in 시퀀스 아이템 {
	실행 코드
}

//시퀀스 아이템 예시: 0...2, 0..<2, 문자열, 배열

- 딕셔너리를 for in 구문으로 꺼내오면, 넘겨받는 값이 튜플이다.

- 따라서 딕셔너리의 경우 key, value 쌍으로 가져올 수 있다. 정리한 링크

- 만약 역순으로 루프를 돌고싶다면?

(1...10).reversed() 혹은 for i in stride(from: 시작값, to: 끝값+1, by: 음수(-1, -2...) 사용

- 일정 스텝씩 건너뛰어서 루프를 돌고싶다면?

for i in stride(from: 시작값, to: 끝값+1, by: 양수(2, 3, 4, ....) 사용

 

3. repeat-while 구문

- 다른 프로그래밍 언어의 do-while 구문과 유사함

- repeat 블록의 코드를 일단 먼저 실행한 다음에, while 다음의 조건이 성립하면 블록 내부의 코드 반복 실행

var names: [String] = ["John, "Jennty", "Joe", "yuri"]

repeat {
	print("bye.. \(names.removeFirst()")
} while names.isEmpty == false


//bye.. John
//bye.. Jennty
//bye.. Joe
//bye.. yuri

 

* 구문 이름표

- 구문에 이름을 지정하여 제어할 때 유용함

- 주로 중첩 반복문에서 특정 반복문만 종료시켜버릴 때 많이 사용함 (원래 지정없이 break 하면 가장 인접한 반복문만 종료됨)

var numbers: [Int] = [3, 2342, 6, 3252]

numbersLoop: for num in numbers {
	if num > 5 || num < 1 {
    	continue numbersLoop
    }
 	
    var count: Int = 0
    
    printLoop: while true {
    	print(num)
        count +=1
        
        if count == num {
        	break printLoop
        }
    }
    
    removeLoop: while true {
    	if numbers.first != num {
        	break numbersLoop
        }
        numbers.removeFirst()
  	}
}

//3 -> 1) printLoop만 계속 돌다가, num과 count가 일치(3) 하는순간 빠져나와서 removeLoop 실행
//3
//3
//2) 그 다음 removeLoop에서 첫번째 요소인 3이 삭제될때, num과 첫번째 요소가 다르므로 맨 바깥 반복문을 중지시킴
//마지막 최종 배열은 [2342, 6, 3252]

 

4. guard 문 ⭐

- if 문과 유사하나, if 문을 여러번 사용했을 때의 안좋아지는 가독성을 더 좋게 만들어주는 구문

guard 조건문 else { return/throw/break/continue }

code 부분

- 조건문이 true이면 그 아래 code를 실행하고, 아니라면 else 코드블럭 실행하므로, 이른 판별 후 조기종료가 가능하다. (조건이 맞지 않으면 아얘 실행을 안하도록 함)

 

사용 이유?

1) if 의 중첩을 막아 코드가 지저분해보이는 것을 방지하고, 코드의 가독성을 높임

2) 여러 개의 옵셔널 타입을 완전하게 벗기기 가능

 

 

반응형