반응형

if와 switch를 사용하여 조건문을 만들고 for-in, while 및 repeat-while을 사용하여 반복문을 만듭니다.

 

A Swift Tour ( https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html ) 문서의 코드를 Swift Playground(  https://swiftfiddle.com/ ) 에서 실행시켜 보며 진행해보았습니다. 

 

본 문서는 공부한 내용을 정리하는 목적으로 작성되었으며 A Swift Tour 문서의 내용을 바탕으로 하고 있습니다. 잘못된 점이 있을 수 있습니다

 

2021. 10. 07   최초작성 

2021. 11. 02   접속 불가 상태인 Swift Playground 사이트 변경

2022. 10. 22   최종수정



for - in 문을 사용하여 배열의 원소에 하나씩 접근하여 원소를 출력합니다.

let individualScores = [75, 43, 103, 87, 12]


// 배열 individualScores의 원소를 score로 접근할 수 있습니다.
for score in individualScores {
    print(score)
}

 

배열의 원소가 하나씩 출력되었습니다. 

75
43
103
87
12

 

if 문을 사용하여 배열 individualScores에 있는 값이 50 이상이면 변수 teamScore에 3을 더하고 배열 individualScores에 있는 값이 50보다 작거나 같은 경우에는 teamScore에 1을 더하는 코드입니다. 

for문과 if문의 조건에는 괄호가 없고 if문과 for문의 조건에 따라 실행되는 코드를 감싸는 중괄호가 있는 것을 볼 수 있습니다.

let individualScores = [75, 43, 103, 87, 12]

var teamScore = 0


// 배열 individualScores의 원소를 score로 하나씩 접근하여 원소의 값이 50보다 크면 변수 teamScore에 3을 더하고
// 원소의 값이 50보다 크지 않으면 변수 teamScoredp 1을 더해줍니다. 
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}
print(teamScore)

 

최종 결과 값이 출력됩니다.

11

 

if문의 조건으로 변수만을 사용할 수 없습니다. 변수값이 0이 아닌지 여부를 판정해주는 것은 지원하지 않고 에러로 취급합니다.

var v = 10

if v {
    print("v is not 0")
}

 

main.swift:5:4: error: 'Int' is not convertible to 'Bool'
if v {
   ^

 

옵셔널(Optional)

기본적으로 Swift에선 모든 상수와 변수에 값이 대입되어 있어야 합니다.

하지만 if와 let을 함께 사용하여 변수에 값이 없는 경우를 고려할 수 있습니다. 

값이 없는 경우를 nil로 표현하는데 그냥 바로 변수나 상수에 대입하면 안되고 ?로 표현되는 Optional로 선언하여 사용해야 합니다.  

 

변수를  optional로 선언 하려면 변수의 타입 뒤에 물음표(?)를 추가합니다.

// 상수 possibleString1은 값이 없는 nil일 수도 있고 문자열 “Hello”일 수도 있기 때문에
// 상수 possibleString1을 출력해보면 Optional(“Hello”)가 출력됩니다.
let possibleString1: String? = "Hello"
print(possibleString1)


// if let문은 Optional로 선언된 변수의 값이 nil이 아니라면 변수 actualString에 값을 대입하고 
// 중괄호내에 있는 print문을 실행하기 때문에 여기에선 변수 actualString의 값이 출력됩니다.
if let actualString = possibleString1 {
    print("possibleString1", actualString)
}

// 상수 possibleString2은 값이 없는 nil이므로 출력해보면 nil이 출력됩니다.
let possibleString2: String? = nil
print(possibleString2)


// if let문에서 possibleString2의 값은 nil이기 때문에 변수 actualString에 값이 대입되지 않으며
// 중괄호의 문이 실행되지 않습니다.
if let actualString = possibleString2 {
    print("possibleString2", actualString)
}

 

Optional("Hello")
possibleString1 Hello
nil

 

optional 값을 처리하는 또 다른 방법은 ??를 사용하여 기본값을 제공하는 것입니다. optional 변수의 값이 nil인 경우 ?? 뒤에 적어준 기본값이 대신 사용됩니다.

 

변수 nickname의 값이 nil이므로 ?? 뒤에 있는 변수 fullName 의 값이 대신 사용됩니다.

let nickname: String? = nil
let fullName: String = "John Appleseed"


// 변수 nickname의 값이 nil이므로 ?? 뒤에 주어지는 변수 fullName의 값이 출력됩니다.
print("Hi \(nickname ?? fullName)")

 

Hi John Appleseed

 

변수 nickname의 값이 nil이 아니므로 ?? 뒤에 있는 변수 fullName 대신에 변수 nickname의 값이 출력됩니다. 

let nickname: String? = "webnautes"
let fullName: String = "John Appleseed"

print("Hi \(nickname ?? fullName)")

 

Hi webnautes

 

switch - case

switch문은 모든 타입의 변수/상수와 다양한 비교 연산을 지원합니다.  C언어처럼 정수만 비교하여 같은지 테스트하여 동작하는 건 아닙니다.

 

실행해보면 문자열 papper가 있는지 체크하는 case문에 있는 print문이 출력되게 됩니다.

 

let vegetable = "red pepper"


// 변수 vegetable의 값을 체크합니다.
switch vegetable {


// 변수의 값이 celery와 같은지 체크합니다.
case "celery":
    print("Add some raisins and make ants on a log.")


// 변수의 값이 cucumber 또는 watercress인지 체크합니다.
case "cucumber", "watercress":
    print("That would make a good tea sandwich.")


// 문자열 pepper가 포함되어 있는지 체크합니다.
case let x where x.hasSuffix("pepper"):
    print("Is it a spicy \(x)?")


// 앞에 있는 조건들을 만족하지 않는 경우 실행되는 코드입니다.
default:
    print("Everything tastes good in soup.")

}

 

Is it a spicy red pepper?

 

위 예제코드에서 default를 삭제하면 다음과 같은 에러가 발생합니다.

main.swift:5:1: error: switch must be exhaustive
switch vegetable {
^
main.swift:5:1: note: do you want to add a default clause?
switch vegetable {
^

 

조건이 맞는 case문에 있는 코드를 실행한 후 프로그램은 switch 문에서 종료됩니다. 그 다음에 오는  case문의 코드를 실행하지 않습니다.

C언어처럼 case문 끝마다 break를 입력하여 switch문에서 빠져나오게 할 필요가 없습니다. 

 

for - in

for-in을 사용시 딕셔너리의  각 키-값 쌍에 이름 쌍을 제공하여 딕셔너리의 항목에 접근할 수 있습니다.

딕셔너리는 순서가 지정되지 않은 컬렉션이라 실행할 때마다 딕셔너리 원소의 출력 순서가 바뀌는 것을 볼 수 있습니다. 

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]


// 딕셔너리 interestingNumbers의 원소를 두 개의 변수 key, number를 사용하여 각각 key와 value를 접근합니다.
// 괄호안에 두개의 변수를 적어 값을 받아오는데 두 개 이상의 값을 이렇게 괄호로 묶는 것을 튜플이라고 합니다.
for (key, numbers) in interestingNumbers {
    print(key, numbers)
}

 

Square [1, 4, 9, 16, 25]
Prime [2, 3, 5, 7, 11, 13]
Fibonacci [1, 1, 2, 3, 5, 8]

 

딕셔너리에 포함되어 있는 배열의 원소중 가장 큰 값을 출력하는 코드입니다.

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

// key는 필요 없어서 값을 받지 않기 위해 변수대신 언더바(_)로 지정하고 있습니다.
for (_, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}

print(largest)

 

25

 

while / repeat - while

조건을 만족하는 동안  코드 블록을 반복하려면 while을 사용합니다.

n이 100보다 작을 동안  기존 변수 n의 값에 2를 곱하는 예제입니다.

var n = 2


// 변수 n의 값이 100보다 작을 동안 반복합니다.
while n < 100 {


    // 변수 n의 기존값에 2를 곱하여 변수 n에 대입합니다.
    n *= 2
}

print(n)

 

128

 

루프가 최소 한번은 실행될수 있도록 루프의 조건이 코드 블록 끝에 위치할 수 있습니다.

이때에는 루프앞에 repeat를 추가하고 while을 루프 끝에 추가합니다.

var m = 2

// repeat에는 조건이 없기 때문에 최소한 1번은 코드가 실행됩니다.
repeat {
    m *= 2
} while m < 100

print(m)

 

128

 

..<

..<를 사용하여 인덱스 범위를 지정할 수 있습니다. 

아래 코드를 실행하면 인덱스 범위는 0 ~ 3을 출력합니다. 인덱스 범위에서 마지막 값으로 지정한 4가 빠진 것을 볼 수 있습니다. 

for i in 0..<4 {
    print(i)
}

 

0
1
2
3

 

...을 사용하면 범위의 마지막값도  범위에 포함됩니다. 

아래 코드를 실행해보면 인덱스 범위가 0 ~ 4가 출력됩니다.

for i in 0...4 {
    print(i)
}

 

0
1
2
3
4



참고

 

https://devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-2/optionals.html

 

https://drewag.me/posts/2014/07/05/what-is-an-optional-in-swift#optional-binding




Swift 강좌 1 - Hello, world

https://webnautes.tistory.com/1549



Swift 강좌 2 - 상수와 변수

https://webnautes.tistory.com/1550



Swift 강좌 3 - 제어문 : if, for - in, switch, repeat - while

https://webnautes.tistory.com/1551



Swift 강좌 4 - 함수

https://webnautes.tistory.com/1552



Swift 강좌 5 - 객체(Objects)와 클래스(Classes)

https://webnautes.tistory.com/1558



Swift 강좌 6 - 열거형(Enumerations)과 구조체(Structures)

https://webnautes.tistory.com/1559



Swift 강좌 7 - 프로토콜(Protocols)과 익스텐션(Extensions)

https://webnautes.tistory.com/1562



Swift 강좌 8 - 에러 처리(Error Handling)

https://webnautes.tistory.com/1566



Swift 강좌 9 - 제네릭(Generics)

https://webnautes.tistory.com/1568



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts