반응형

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. 7  - 최초작성 

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


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

 

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

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

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")
}



/tmp/AB1A5F9F-C1EC-4580-AAAA-91003D4144D0.0HO3Fw/main.swift:5:4: error: 'Int' is not convertible to 'Bool'
if v {
   ^




옵셔널(Optional)

 

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

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

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



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

 

let possibleString1: String? = "Hello"
print(possibleString1)
if let actualString = possibleString1 {
    print("possibleString1", actualString)
}


let possibleString2: String? = nil
print(possibleString2)
if let actualString = possibleString2 {
    print("possibleString2", actualString)
}



상수 possibleString1은 값이 없는 것을 의미하는 nil 일수도 있고 “Hello”일 수도 있기 때문에 해당 상수를 출력해보면 Optional("Hello")로 출력됩니다. 



if let 문은 Optional로 선언된 변수에 값이 있으면 해당 값을 상수에 대입하고 중괄호에 있는 코드를 실행하며 Optional로 선언된 변수의 값이  nil 인 경우에는 중괄호에 있는 코드를 실행하지 않습니다. 

 

possibleString1에는 “Hello”를  대입하여 Optional로 선언되었기 때문에 첫번째 print문의 Hello가 출력됩니다.

 

하지만 possibleString2에는 nil을  대입하여 Optional로 선언되었기 때문에 if let의 중괄호에 있는 두번째 print 문은 실행되지 않습니다. 

 

Optional("Hello")
possibleString1 Hello
nil




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



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

 

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

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"

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"):
    print("Is it a spicy \(x)?")

default:
    print("Everything tastes good in soup.")

}



Is it a spicy red pepper?




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

 

/tmp/2523DD29-26B3-44B0-A25A-13BA915A88D9.hKFNql/main.swift:5:1: error: switch must be exhaustive
switch vegetable {
^
/tmp/2523DD29-26B3-44B0-A25A-13BA915A88D9.hKFNql/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],
]

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

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

while n < 100 {
    n *= 2
}

print(n)



128





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



var m = 2

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




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://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



반응형

해보고 확인한 것을 문서화하여 기록합니다.
최소 일주일에 한번 이상 포스트를 하려고 노력중입니다.

부족함이 있지만 도움이 되었으면 합니다.
잘못된 부분이나 개선점을 알려주시면 감사하겠습니다.



포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
문제가 생기면 포스트와 바뀐 상황이 있나 확인해보세요.
시간날때 마다 이전 포스트가 문제 있는지 확인을 해보려고 노력하고 있습니다.
생각보다 시간이 많이 걸리네요 : )
질문을 남겨주면 가능한 빨리 답변드립니다.


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

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">