Coding Log

스위프트 찔러보기 - (2) 흐름 제어

본 블로그에 올라가는 포스팅은 애플의 공식 사이트를 대강 번역해서 작성하는 것이기 때문에 아래 링크에서 찔러보기 포스팅에서 쓸 예제 코드를 받을 수 있다.

참고 애플의 Playground를 이용한 Swift Example 다운로드 링크

if문

Swift에서는 ifswitch를 이용해서 프로그램의 흐름을 분기할 수 있는 조건문을 만들 수 있으며, for-inforwhilerepeat-while을 이용해 특정 코드를 반복해서 실행하는 반복문을 만들 수 있다.

조건문과 반복문을 작성할 때 중괄호 { }로 조건문과 반복문 내부의 동작 코드를 감싸는 것을 잊지말자.

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
   if score > 50 {
       teamScore += 3
   } else {
       teamScore += 1
   }
}
print(teamScore)

if 문 안의 조건식은 꼭 true나 false를 반환하는 Boolean 표현식이여야 한다.

if score {
  // Body 
}

위와 같이 표현하면 score를 0과 비교하는 것인지 알 수없기 때문에 에러가 발생한다.

Swift의 옵셔널(Optional)을 이용한 특이한 if문도 있다.

상수를 저장하는 let을 사용하여 특정 누락값을 처리할 수 있다.

값의 타입 뒤에 ?를 붙이면 옵셔널이라는 것을 뜻한다.

즉 값을 가질수도 있거나 아예 없거나라는 것을 표현하는 키워드이다.

값이 없을 때는 nil을 사용한다.

var optionalString: String? = nil // 타입 다음에 ?를 붙이면 옵셔널이다. 
optionalString == nil // 값이 없다면 true를 출력 
 
var optionalName: String? = nil
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

위의 코드에서 optionalName에 할당된 값이 nil이기 때문에 if문은 거짓(false)이 되고 if문의 body를 실행하지 않고 건너뛰게 된다.

var optionalString: String? = nil // 타입 다음에 ?를 붙이면 옵셔널이다. 
optionalString == nil // 값이 없다면 true 
 
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

위와 같이 optionalName에 값이 John Appleseed로 저장되면 if문은 참(true)이 되고 if문의 body를 실행하여 greeting에 저장되는 값이 "Hello, John Appleseed"이 될 것이다.

옵셔널 값을 처리하는 다른 방법으로는 ?? 연산이 있다.

let nickName: String? = nil // optional value 
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"

위의 코드에서 nickName이 옵셔널임을 확인하자.

nickName이 nil을 가지고 있기 때문에 ?? 연산자에 의해 fullName을 선택하게 된다.

따라서 informalGreeting에는 "Hi John Appleseed"이 저장된다.

만약 아래와 같이 nickName이 값을 가지고 있다면

let nickName: String? = "Neil Armstrong" // optional value 
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"

?? 연산자에 의해 informalGreeting은 "Hi Neil Armstrong"이 저장될 것이다.

switch문

switch문은 정수와 객체 타입 비교는 물론 모든 종류의 데이터와 비교 연산을 지원한다.

let vegetable = "red pepper"
 
switch vegetable {
case "celery": // celery인 경우 
    print("Add some raisins and make ants on a log.")
 
case "cucumber", "watercress": // cucumber 혹은 watercress 인 경우 
    print("That would make a good tea sandwich.")
 
case let x where x.hasSuffix("pepper"): // 문자열의 끝이 pepper로 끝나는 경우 
    print("Is it a spicy \(x)?")
 
default: // celery도 cucumber도 watercress도 아닌 경우 
    print("Everything tastes good in soup.")
}

위의 코드의 주석을 확인해보자.

switch문은 비교할 값이 정확히 일치하는 case에 해당하는 코드를 실행한 뒤 switch문을 빠져나온다.

말 그대로 switch문을 빠져나오기 때문에 break를 쓸 필요가 없다.

for-in문

for-in문을 이용하면 key와 value가 쌍을 이루고 있는 딕셔너리에 대해서 key값을 이용해 반복 접근할 수있다.

물론 딕셔너리는 요소들의 순서가 정해지지 않았기때문에 임의의 순서로 반복하게 된다.

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) // 가장 큰 수인 25가 출력된다. 

while문, repeat-while문

while문을 사용하면 특정 코드 블록(while문에 속하는 body)를 계속해서 반복적으로 실행할 수 있다.

물론 조건의 변경을 이용해 무한히 실행되지 않도록 처리할 수 있다.

즉, 바꿔말하면 조건이 변경될 때까지 while문을 이용해 반복 실행할 수 있다.

var n = 2
while n < 100 { // n이 128이 되는 순간 false가 되어 중지 
    n = n * 2
}
print(n) // 128을 출력 
 
var m = 2
repeat {
    m = m * 2
} while m < 100 // m이 128이 되는 순간 false가 되어 중지 
print(m) // 128을 출력 

위의 코드는 결과는 똑같지만 다른 부분이 있다.

위의 while문 같은 경우엔 제일 처음에 조건이 맞지 않으면 실행조차 되지 않지만 repeat-while문의 경우 먼저 최초 실행을 한뒤에 조건을 비교한다.

var n = 128
while n < 100 { // n이 128이 되는 순간 false가 되어 중지 
    n = n * 2
}
print(n) // 128을 출력 
 
var m = 128
repeat {
    m = m * 2
} while m < 100 // m이 128이 되는 순간 false가 되어 중지 
print(m) // 256을 출력 

위의 코드에서 n과 m을 128로 저장한 뒤 실행하면 n은 128, m은 256이 출력된다.

위의 두 예제를 비교해보면 차이점을 알 수 있을 것이다.

..<를 사용하여 특정 반복문의 반복 횟수 혹은 요소에 접근하기 위한 인덱스 범위도 컨트롤 할 수 있다.

var total = 0
for i in 0..<4 { // i가 0부터 3까지 반복한다. 
    total += i
}
print(total) // 6을 출력한다. (0 + 1 + 2 + 3 = 6) 

...를 사용하면 ..<와 달리 끝의 값도 포함하게 된다.

var total = 0
for i in 0...4 { // i가 0부터 4까지 반복한다. 
    total += i
}
print(total) // 10을 출력한다. (0 + 1 + 2 + 3 + 4 = 10) 


DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다