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
'Swift' 카테고리의 다른 글
Swift 강좌 5 - 객체(Objects)와 클래스(Classes) (0) | 2022.10.22 |
---|---|
Swift 강좌 4 - 함수 (0) | 2022.10.22 |
Swift 강좌 2 - 상수와 변수 (0) | 2022.10.22 |
Swift 강좌 1 - Hello, world (0) | 2022.10.22 |
SwiftUI 강좌 - Introducing SwiftUI 따라잡기 - 장소 소개하는 화면 만들기 (0) | 2022.01.16 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!