Swift-2 제어 흐름

영점·2022년 8월 31일

Swift_Study

목록 보기
2/12

스터디를 진행하며 처음부터 다시 Swift를 공부하고 있습니다.
오늘 작성할 파트는 제어흐름 (반복문, 조건문) 입니다.

1. For-in 루프

요소for-inforEach
개념컬렉션에 저장된 요소 수만큼 반복되며, 저장된 요소가 루프 상수에 하나씩 들어간다반복 실행하려는 코드를 파라미터로 받고, 저장된 요소는 클로저 상수로 전달된다
형태for (for문에서만 쓸 변수명) in (변수명) { }(변수명).forEach { }

배열에 아이템, 범위의 숫자, 또는 문자열에 문자와 같은 연속된 것에 대해 for-in 루프를 사용하여 반복할 수 있습니다.

형태는 for ( 반복문 안에서 사용할 변수명 ) in ( 선언해둔 변수명 ) { ( 조건 만족시 실행할 구문 ) } 입니다.

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    print("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!

딕셔너리의 키-값 쌍 접근을 위해 반복을 사용할 수도 있습니다.

Dictionary의 콘텐츠는 순서가 없으며 반복으로 가져올 아이템에 대한 순서를 보장하지 않습니다.

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}
// cats have 4 legs
// ants have 6 legs
// spiders have 8 legs

숫자 범위에 대해 for-in 루프를 사용할 수도 있습니다.

범위를 …으로 잡을 수도있고, ..<으로도 잡을 수 있습니다.

for index in 1...5 {
    print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
let minutes = 60

for tickMark in 0..<minutes {
    // render the tick mark each minute (60 times)
}

시퀀스로 부터 각 값이 필요하지 않으면 변수 이름의 위치에 언더바를 사용하여 값을 무시할 수 있습니다.

( 해당 패턴(_)을 와일드카드 패턴이라고 부른다고 합니다.. )

let base = 3
let power = 10
var answer = 1

for _ in 1...power { //1~10까지 반복
    answer *= base //반복하면 3의 10승 => 59049
}
print("\(base) to the power of \(power) is \(answer)")
//3 to the power of 10 is 59049

2. While 루프

while루프는 조건이 false가 될 때까지 구문의 집합을 수행합니다.

이러한 루프는 첫번째 반복이 시작되기 전에 반복 횟수를 알 수 없을 때 가장 잘 사용됩니다.

형태는 while (반복조건) { ( 조건 성립시 수행할 구문 ) } 입니다.

let x = 5
let y = 10

while x < y {
	x+=1
	print(x)
}

/*
6
7
8
9
10
*/

repeat-while문도 있는데, C언어의 do-while문과 같습니다.

형태는 repeat { ( 수행할 구문 ) } while ( 반복조건 ) 입니다.

let x = 5
let y = 10

repeat {
	x+=1
	print(x)
} while x < y

/*
6
7
8
9
10
*/

while문과 repeat-while의 차이점은

repeat-whilewhile과 다르게 조건에 안맞아도 일단 한 번은 꼭 실행한다는 점입니다.

3. If

👉🏻 만약(if) ~라면(조건) {(행위)}해라. 아니라면(else if / else) {(행위)} 해라.

let temp = 33

if temp <= 20 {
    print("It's very cold. Consider wearing a scarf.")
} else if temp >= 30 {
    print("It's really warm. Don't forget to wear sunscreen.")
} else {
    print("It's not that cold. Wear a t-shirt.")
}
//It's really warm. Don't forget to wear sunscreen.

여기 if 구문은 특정 따뜻한 기온에 응답하기 위해 추가 되었습니다.

마지막 else 절은 남아있고 어떤 기온이 너무 따뜻하거나 너무 춥지 않을 경우에 응답을 출력합니다.

그러나 마지막 else 절은 옵셔널이고, 이 조건이 완벽하게 필요가 없으면 제외할 수 있습니다.

4. switch-case

Swift의 switch-case는 C언어와 다르게 첫번째 케이스가 일치하자마자 switch 구문은 완료됩니다.

C언어처럼 여러 case를 실행하지 않습니다.

let someCharacter: Character = "z"

switch someCharacter {
case "a", "A" :
    print("The first letter of the alphabet")
case "z":
    print("The last letter of the alphabet")
default:
    print("Some other character")
}
//The last letter of the alphabet

switch는 모든 알파벳 문자 뿐만 아니라 모든 가능한 문자에 대한 케이스를 가지고 있어야 하므로

이 switch구문은 a와 z을 제외한 다른 모든 문자는 default케이스를 사용합니다.

⚠️  만약 default를 작성하지 않는다면 “Switch must be exhaustive” 에러가 뜹니다!!

⚠️  각 케이스의 바디는 적어도 하나의 실행가능한 구문이 포함되어야 합니다!!

5. Where

조건을 더 추가하고 싶을 때, 특정 타입에 제한을 두고 싶을 때 등 필요할 때마다 도와주는 역할.

let arr: [Int] = [1, 2, 3, 4, 5, 6, 7, 8]

// i 요소가 2로 나눴을때 0일 경우(짝수)일 때만 블록 실행
for i in arr where i % 2 == 0 {
    print(i)
}

/*
2
4
6
8
*/
//더 간단한 예제를 생각해보고 있습니다..

let yetAnotherPoint = (1, -1)

switch yetAnotherPoint {
case let (x, y) where x == y:
    print("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    print("(\(x), \(y)) is on the line x == -y")
case let (x, y):
    print("(\(x), \(y)) is just some arbitrary point")
}
//(1, -1) is on the line x == -y

6. 제어 변경

continue : 루프를 완전히 벗어나지 않고 현재 루프 반복 완료

//더 간단한 예제를 생각해보고 있습니다..

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "]

for character in puzzleInput {
    if charactersToRemove.contains(character) { //charactersToRemove의 index에 있는 알파벳이 puzzleInput에도 존재한다면
        continue //루프를 벗어나지 않고 현재 루프 반복
    }
    puzzleOutput.append(character)
}
print(puzzleOutput)
//grtmndsthnklk ( a,e,i,o,u,공백을 제거한 puzzleInput 값을 puzzleOutput에 추가한 결과 )

break : 제어흐름 구문을 즉시 종료 ( C언어와 동일 )

let someChar: Character = "z"

switch someChar {
case "a" :
    print("The last letter of the alphabet")
default:
    break
}
print("get out") //break를 빠져나와 get out 출력

만약 조건에 일치하지 않았다면 break를 타고 switch-case문을 빠져나와 다음 작업을 수행.

fallthrough : 다음 case도 동작하도록 만들기

fallthrough키워드는 switch-case 실행을 위한 case 조건을 확인하지 않습니다.

//더 간단한 예제를 생각해보고 있습니다..

let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"

switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " a prime number, and also"
    fallthrough
default:
    description += " an integer."
}
print(description)
// Prints "The number 5 is a prime number, and also an integer."

fallthrough를 사용하지 않으면 default에 있는 " an integer."은 출력되지 않습니다.

7. Guard ( 내용 추가 / 공부 더 필요!! ) ⭐️

추후 옵셔널 바인딩 공부시 내용을 더 상세히 다룰 예정..

종류ifguard
의미만약 ~라면 ~해라 ( 무한 반복 )~가 아니라면 끝내라 ( 빠른 종료 )
구문if 조건 { (true일때 실행될 구문) } else { (false일때 실행될 구문) }guard 조건 else { (false 일 때 실행될 구문) return }(true 일 때 실행될 구문)
특징함수나 메서드 혹은 반복문 안에서만 사용 가능
장점가독성을 높여주고 조건문을 만족하지 않을 때 처리가 확실하다.
차이else문을 생략할 수 있다.항상 else문을 가진다.

참고 : https://80000coding.oopy.io/0bd77cd3-7dc7-4cf4-93ee-8ca4fbca898e

https://bbiguduk.gitbook.io/swift/
https://babbab2.tistory.com

profile
일단 배운내용은 적어두기

0개의 댓글