A Swift Tour로 Swift 공부하기 #3. Control Flow 제어 흐름

minin·2021년 2월 12일
1

A Swift Tour

목록 보기
2/8

🍫 notion으로 보기
*본 포스트는 애플의 'A Swift Tour'를 바탕으로 작성되었으며, 공부하며 기록용으로 작성한 포스트이기 때문에 정확하지 않은 정보가 있을 수 있습니다!
** notion으로 작성한 문서를 임시로 올려둔 포스트이기 때문에 사진 링크의 오류와 문서의 형식 등으로 인해 보시기에 불편함이 있을 수 있습니다. (사진이 안나오거나 코드를 보기 불편한 점 등은 빠른 시일 내에 수정하도록 하겠습니다!)

3. Control Flow 제어 흐름

조건condition을 만들기 위해 if 혹은 switch 를 사용하고,

반복loops을 만들기 위해 for-in, while ,repeat-while을 사용한다.

이 때, 조건이나 반복문을 괄호()로 감싸는 것은 선택이지만, 중괄호{}로 감싸는 것은 필수이다.

1. for반복문과 if문

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores { //individualScoress내의 요소score에 대해 반복
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}
print(teamScore)

  • print

위에서 for문을 돌린 결과, teamScore은 11이 출력되며, 그 과정은 위의 표와 같다.

이 때 if문에서 주의할 점은 if문의 결과 값이 TRUEFALSE 중 한 가지의 값을 가지는 boolean 표현이어야 한다는 것이다.

2. if let

그리고 missing될 수 있는 값의 경우에는 iflet을 같이 사용할 수 있다. 이러한 값들은 optionals로 표현된다. optional 값은 값이 존재하는 것과, 혹은 missing값인 nil(값이 존재하지 않음)을 포함한다. optional 값을 표현하기 위해서는 값의 타입 뒤에 물음표?를 붙인다.

var optionalString: String? = "Hello"
print(optionalString == nil)    // ==는 bool. true/false
  • print
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {  //(let name = optionalName)이 true/false의 값 가짐.
    greeting = "Hello, \(name)"
}
print(greeting)
  • print

experiment

var optionalName: String? = nil
var greeting = "Hello!"
if let name = optionalName {  //(let name = optionalName)이 true/false의 값 가짐.
    greeting = "Hello, \(name)"
}else {
		greeting = "Hello, stranger"
}
print(greeting)v
  • print

만약 optional 값이 nil이면, 조건은 false가 되고 조건문은 스킵하게 된다.

optional 값이 nil이 아니면, 값은 벗겨지고unwrapped, let 뒤 상수에 할당되어 if문 내의 코드를 수행한다.

3. ?? → optional ?? defaultValue

그리고 위에서 제시한 방법 외에 또 다른 방법이 있는데, 이는 **??**연산자를 사용하여 default Value를 제공하는 것이다. 만약 optional값이 nil이면, default Value가 대신 사용된다.

let nickname: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickname ?? fullName)"

위의 예시에서, optional 값인 nickname이 nil이므로, nill이 아닌 fullName을 반환한다.

  • ?? 에 대해 더 자세히 알아보기

4. Switch

switch는 모든 종류의 데이터와 다양한 비교 연산자를 지원한다. 그들은 정수와 동등성test for equality에 한계를 두지 않는다.

let vegetable = "red pepper"
switch vegetable {
case "celery":
    print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
    print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):  //"pepper"가 들어갔다면 -> match
    print("Is it a spicy \(x)?")
default:
    print("Everything tastes good in soup.")
}
  • print

**default:

위의 코드에서 default: 부분을 없애면, 실행이 되지 않는다.

⛔️ Switch must be exhausive. Do you want to add a default clause?

swich에서 중요한 것은 let의 값과 일치하는 패턴을 어떻게 할당할 것인지이다.

일치하는 코드를 실행한 후에, 프로그램은 swich문으로부터 나간다. 매치된 코드를 실행한 후에는 다음 케이스로 넘어가지 않기 때문에, (다른 언어들 처럼)break를 각 케이스가 끝날 때 명시할 필요가 없다.

5. for- in

for- in은 각각의 key-value 쌍을 나타내는 이름의 쌍pair of names을 제공해서 사전dictionary에 있는 아이템들을 반복할 수 있다. 단, 사전dictionary는 무질서한unordered 모음이기 떄문에, 그 key-values들은 임의의 순서로 반복된다.

let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
print(largest)
  • print

experiment

largest의 kind가 무엇인지 추적하는 변수 추가하기.

var largestKind = "" // 변수 largestKind를 String으로 초기화한다.

largest = number가 실행될 때 largestKind = kind를 통해 업데이트 한다.

let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
var largestKind = ""
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
            largestKind = kind
        }
    }
}
print("The largest number is \(largest) of \(largestKind)")
  • print

6. while

while은 조건이 바뀔 때까지 코드 블럭을 반복한다. 반복의 조건을 마지막에 두어 반드시 한 번은 코드를 실행하게 할 수도 있다.

//  while 예제 1
var n = 2
while n < 100 {
    n *= 2
}
print(n)

//  while 예제 2
var m = 2
repeat {
    m *= 2
} while m < 100
print(m)
  • print

while 예제 1에서는 조건에 부합할 경우 반복문 안에 들어갈 수 있는 반면,

while 예제 2에서는 우선 한 번 실행한 후에 조건을 확인한다.

7. for i in 0..<4

..<를 사용해서 인덱스의 범위를 결정할 수 있다.

..<: 최대값 포함지 않음**omits its upper value

...: 양쪽의 값을 포함**

var total = 0
for i in 0..<4 {  //0부터 4미만까지 반복한다. (0123)
    total += i
}
print(total)
  • print
profile
🍫 iOS 🍫 Swift

0개의 댓글