티스토리 뷰

Swift Language Guide

3. Control Flow

지우개. 2020. 10. 28. 16:06

스위프트는 여러번 반복할 수 있는 while문이나, if guard 그리고 switch 같이 특정 상태에 기반하여 실행되는 조건문들, 그리고 break 나 continue 처럼 실행의 흐름을 다른 포인트로 이동시키거나 하는 다양한 Control flow 문을 제공합니다.

 

스위프트는 또한 배열, 딕셔너리, ranges, 스트링값이나 다른 sequences를 쉽게 반복할 수 있는 for-in 루프문을 제공합니다.

 

스위프트의 switch 문은 C와 유사한 언어들과 비교하여 많은 이점을 가지고 있습니다. case 는 더 많은 패턴을 매치시킬 수 있고 매치된 값은 임시적인 상수 혹은 변수로 저장되어 case의 바디 내부에서 사용 할 수 있습니다. 또한 where 를 사용하여 복잡한 조건을 매칭시킬 수 도 있습니다.

 

For-In Loops

다 알고 있는 내용들을 담고 있는데 그나마 기억해볼 만 한 부분이라면 Dictionary를 반복할 때 정렬되지 않은 상태임으로 당연히 insert한 순서대로 나오지 않는다는 것. 

 

그리고 하나 더 기억해볼 만 한 부분은 stride.

등비수열을 생각하면 된다.

let minutes = 60

let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
    // render the tick mark every 5 minutes (0, 5, 10, 15 ... 45, 50, 55)
}

let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
    // render the tick mark every 3 hours (3, 6, 9, 12)
}

to 는 열려있는 형태, through는 닫혀있는 형태임을 기억하자.

 

While Loops

익히 알고 있는 while 문. 가이드에서는 첫 번째 반복이 시작되기 전에 반복 횟수를 알 수 없는 경우에 사용하기 가장 적합하다고 한다.

다른 언어와 다른 점은 do - while문이 repeat-while 문이라고 불린다는 것. 사용방법은 동일하다. 실행 후 조건을 체크한다.

 

여기서부턴 조건문들.

 

If

너무 많이많이 사용되고 그 만큼 잘 알고있어 생략.

 

Switch

모든 스위치문은 철저해야 한다. 모든 가능성이 있는 값들이 고려되어져야 하기 때문이다. 가능할 수 있는 값을 전부 적는 건 적절하지 않고, default 케이스를 써 예외의 경우를 전부 커버시킬 수 있다. default 케이스는 항상 마지막 case여만 한다.

 

C와 Objective-C와는 대조적으로 Swift의 switch문은 각각의 케이스마다 아래로 내려가며 진행하는 것이 아니라, 대신에 전체 switch문을 첫번째 매칭된 case가 끝나면 종료한다. break 같은 상태문 필요없이. 이렇게 함으로서 좀 더 안전하고 쉽게 실수없이 switch문을 사용할 수 있다.

 

또다시 C와는 다르게, switch문은 "A" 와 "a"가 같지 않다. 이렇게 함으로서 좀더 의도를 명확하게 하고 안전한 코드를 만들 수 있다.

"A" 와 "a"를 동시에 매칭시키기 위해 두 개의 값을 콤마로 구분하여 같이 case에 넣는다.

let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
    print("The letter A")
default:
    print("Not the letter A")
}
// Prints "The letter A"

 

switch의 케이스들은 Interval Matching도 가능하다. 아래 예제 참고

let approximateCount = 62
let countedThings = "moons orbiting Saturn"
let naturalCount: String
switch approximateCount {
case 0:
    naturalCount = "no"
case 1..<5:
    naturalCount = "a few"
case 5..<12:
    naturalCount = "several"
case 12..<100:
    naturalCount = "dozens of"
case 100..<1000:
    naturalCount = "hundreds of"
default:
    naturalCount = "many"
}
print("There are \(naturalCount) \(countedThings).")
// Prints "There are dozens of moons orbiting Saturn."

 

Tuples

튜플을 switch 문에 여러가지 조건을 테스트 하러 사용할 수 있다. 튜플 값을 리터럴로 입력해주는 대신에 와일드 카드 패턴(_)을 이용해 모든 가능성을 열어둔 값을 매칭시킬 수도 있다.

let somePoint = (1, 1)
switch somePoint {
case (0, 0):
    print("\(somePoint) is at the origin")
case (_, 0): //와일드카드! x축이 된다.
    print("\(somePoint) is on the x-axis")
case (0, _):
    print("\(somePoint) is on the y-axis")
case (-2...2, -2...2):
    print("\(somePoint) is inside the box")
default:
    print("\(somePoint) is outside of the box")
}
// Prints "(1, 1) is inside the box"

그리고 앞서 언급했듯이 값 바인딩도 가능하다.

let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
    print("on the x-axis with an x value of \(x)")
case (0, let y):
    print("on the y-axis with a y value of \(y)")
case let (x, y):
    print("somewhere else at (\(x), \(y))")
}
// Prints "on the x-axis with an x value of 2"

 

where

case 내에서 조건문 역할을 해주는 친구. 예제를 보면 바로 이해할 수 있다.

let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
    print("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    print("(\(x), \(y)) is on the line x == -y")
case let (x, y):
    print("(\(x), \(y)) is just some arbitrary point")
}
// Prints "(1, -1) is on the line x == -y"

 

x == y 와 x == - y

 

Control Transfer Statements

control transfer statements는 코드의 흐름을 이동시키므로서 실행되는 코드의 오더를 바꿉니다. 스위프트는 5개의 control transfer statements를 가지고 있습니다.

 

  • continue
  • break
  • fallthrough
  • return
  • throw

위 세친구들은 여기서 설명할 예정이나, return은 Function 챕터에서, throw은 Error Handling에서 다룰 예정입니다.

 

Continue

continue 문은 루프문에게 루프안에서 뭘하고 있든 그만두고 다시 다음 반복의 시작으로 넘어가라 라는 뜻임. 나는 현재 루프에서 할 거 다했으니 뒤에서 걍 내버려두고 돈다.

Break

break문은 즉각 종료. switch문에서 쓸 떄는 보통 case당 한줄 이상의 실행문이 필요한 swift의 특성상 실행문이 필요없는 경우에 사용된다.

 

Fallthrough

앞서 언급했듯이 swift의 switch문은 C와는 케이스가 맞다면 실행하고 switch문을 바로 종료한다는 점이 다르다.  만약 C 스타일의 것이 필요하다면 fallthrough를 넣어주면 된다. 

let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " a prime number, and also"
    fallthrough
default:
    description += " an integer."
}
print(description)
// Prints "The number 5 is a prime number, and also an integer."

주의해야할 점이 fallthrough는 아래 조건문을 체크하는 것이 아니다! 그냥 아래로 내려가서 다음 실행문을 실행시키는 것일 뿐이다.

 

Labeled Statements

break문을 써서 바깥쪽 루프도 나가게 해야하는 복잡한 경우에는 Label을 사용할 수 있다.

break label 식으로 바깥쪽으로 종료 및 continue label 식으로 흐름을 바꿀 수 있다.

Checking API Availability

스위프트는 빌드인 내에서 API 호환성 Checking을 지원해준다. if 나 guard 문에서 런타임에서 API가 잘 돌아가는 지 조건부로 코드를 실행한다.

if #available(iOS 10, macOS 10.12, *) {
    // Use iOS 10 APIs on iOS, and use macOS 10.12 APIs on macOS
} else {
    // Fall back to earlier iOS and macOS APIs
}

조건의 마지막 별은  "The last argument, *, is required and specifies that on any other platform, the body of the if executes on the minimum deployment target specified by your target." 해석해보기론 다른 플랫폼에서 지정된 최소 배포 대상에서 실행되도록 지정한다는 말 같은데.. 이해가 잘 안된다..

'Swift Language Guide' 카테고리의 다른 글

6. Enumerations  (0) 2020.11.01
5. Closures  (0) 2020.10.31
4. Functions  (0) 2020.10.29
2. Collection Types  (0) 2020.10.27
1. String and Characters  (0) 2020.10.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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 28
글 보관함