For-In 문(For-In Loops)
- for-in문는 배열,숫자,문자열을 순서대로 순회하기 위해 사용
- let name = ['Bulmang','Jun','Malty','Nova','Jay'] for name in names { print("Hello, \\(name)!") }
- Dictionary에서 반환된 키값쌍으로 구성된 튜플을 순회하며 제어 가능
- let number = ['Bulmang':25,'Jun':27,'Malty':29,'Nova':23,'Jay':29] for (name,age) in nubmer { print("\\(name) : \\(legCount)") }ㅓ
- Dictionary에 담긴 내용은 정렬이 되지 않은 상태, 사전에 넣었던 순서대로 순회되지 않음.아래와 같이 숫자 범위를 지정해 순회
- for index in 1...5{ print("\\(index) times 5 is \\(index *. 5)") }
- for문을 순서대로 제어가 필요 없다면 _키워드를 사용하면 성능을 높일 수 있음
- 찾아본 결과: index를 사용하여 반복하면 수천,수만 번의 반복이 필요한 경우 눈에 띠게 성능 저하
- _키워드를 사용하면 인덱스 값을 가져오지 않아 최적화,반복 수가 많은 코드에서는 성능 향상
- let base = 3 let power = 10 var answer = 1 for _ in 1...power { answer *= base } print("\\(base) to the power of \\(power) is \\(answer)")
- 범위 연산자 사용
- let minutes = 60 for tickMark in 0..<minutes { }
- stride(form:to:by) 함수와 함께 사용할 수 있음, 다음 구간을 5,3으로 설정한 경우
- let minuteInterval = 5 for tickMark in stride(from: 0, to: minutes, by: minuteInterval) { // render the tick mark every 5 minutes (0, 5, 10, 15 ... 45, 50, 55) } let hours = 12 let hourInterval = 3 for tickMark in stride(from: 3,through: hours, by: hour { // render the tick mark every 3 hours (3, 6, 9, 12) }
While 문 (While Loops)
Swift에서는 while과 repeat-while 두 가지 종류의 while 문을 지원
while
조건(condition)이 거짓일때까지 반복
- while condtion { statements }
while문의 예
var square = 0
var diceRoll = 0
while square < finalSquare {
// roll the dice
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
// move by the rolled amount
square += diceRoll
if square < board.count {
// if we're still on the board, move up or down for a snake or a ladder
square += board[square]
}
}
print("Game over!")
Repeat-While 문
- 조건이 false가 될 때까지 코드 블록을 반복 실행하는 제어문
- ‘repeat-while’문은 다음과 같은 구문으로 사용
- 최소 한번 이상 실행해야 된다.
- var i = 0 repeat { print(i) i += 1 } while i < 10
조건적 구문
Swift에서 if와 switch문 두 가지의 조건 구문을 제공
- if
- var temperatureInFahrenheit = 30 if temperatureInFahrenheit <= 32 { print("It's very cold. Consider wearing a scarf.") } temperatureInFahrenheit = 40 if temperatureInFahrenheit <= 32 { print("It's very cold. Consider wearing a scarf.") } else { print("It's not that cold. Wear a t-shirt.") } // Prints "It's not that cold. Wear a t-shirt." temperatureInFahrenheit = 90 if temperatureInFahrenheit <= 32 { print("It's very cold. Consider wearing a scarf.") } else if temperatureInFahrenheit >= 86 { print("It's really warm. Don't forget to wear sunscreen.") } else { print("It's not that cold. Wear a t-shirt.") } // Prints "It's really warm. Don't forget to wear sunscreen."
- Switch
switch some value to consider {
case value 1:
respond to value 1
case value 2,
value 3:
respond to value 2 or 3
default:
otherwise, do something else
}
//문자열
let someCharacter: Character = "z"
switch someCharacter {
case "a":
print("The first letter of the alphabet")
case "z":
print("The last letter of the alphabet")
default:
print("Some other character")
}
// Prints "The last letter of the alphabet"
Swift에서는 break를 적지 않아도 특정 case가 완료되면 자동으로 switch 구문을 빠져 나오게 됩니다. 이런 사용법으로 인해 실수로 break 를 적지않아 의도하지 않은 case 문이 실행되는 것을 방지함.
case 안에 최소 하나의 실행 구문이 반드시 있어야함
case 안에 콤마(,)로 구분해서 복수의 case 조건을 혼합(compound)해 사용할 수 있음.
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
print("The letter A")
default:
print("Not the letter A")
}
// Prints "The letter A
인터벌 매칭 (Interval Matching)
let approximateCount = 62
let countedThings = "moons orbiting Saturn"
let naturalCount: String
switch approximateCount {
case 0:
naturalCount = "no"
case 1..<5:
naturalCount = "a few"
case 5..<12:
naturalCount = "several"
case 12..<100:
naturalCount = "dozens of"
case 100..<1000:
naturalCount = "hundreds of"
default:
naturalCount = "many"
}
print("There are \\(naturalCount) \\(countedThings).")
// Prints "There are dozens of moons orbiting Saturn."T
튜플 (Tuple)
- 튜플을 조건을 사용 가능
- let somePoint = (1, 1) switch somePoint { case (0, 0): print("\\(somePoint) is at the origin") case (_, 0): print("\\(somePoint) is on the x-axis") case (0, _): print("\\(somePoint) is on the y-axis") case (-2...2, -2...2): print("\\(somePoint) is inside the box") default: print("\\(somePoint) is outside of the box") } // Prints "(1, 1) is inside the box"
값 바인딩 (Value Bindings)
- 특정 x, y 값을 각각 다른 case에 정의하고 그 정의된 상수를 또 다른 case에서 사용할 수 있음 이런 기법을 값-바인딩(value bindings)라 부릅니다.
let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
print("on the x-axis with an x value of \\(x)")
case (0, let y):
print("on the y-axis with a y value of \\(y)")
case let (x, y):
print("somewhere else at (\\(x), \\(y))")
}
// Prints "on the x-axis with an x value of 2"
Where 문
case에 where 조건을 사용할 수 있습니다.
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")
}
// Prints "(1, -1) is on the line x == -y"
혼합 케이스 (Compound Cases)
case에 콤마로 구분해 여러 조건을 혼합해 사용할 수 있음.
let someCharacter: Character = "e"
switch someCharacter {
case "a", "e", "i", "o", "u":
print("\\(someCharacter) is a vowel")
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
print("\\(someCharacter) is a consonant")
default:
print("\\(someCharacter) is not a vowel or a consonant")
}
// Prints "e is a vowel"
혼합 케이스에서도 값-바인딩을 사용할 수 있음
let stillAnotherPoint = (9, 0)
switch stillAnotherPoint {
case (let distance, 0), (0, let distance):
print("On an axis, \\(distance) from the origin")
default:
print("Not on an axis")
}
// Prints "On an axis, 9 from the origin"제어 전송 구문 (Control Transfer Statements)
제어 전송 구문 (Control Transfer Statements)
제어 전송 구문은 코드의 진행을 계속 할지 말지 결정하거나, 실행 되는 코드의 흐름을 바꿈
continue
break
fallthrough
return
throw
continue
- continue문은 현재 loop를 중지하고 다음loop를 수행하도록 함
- let puzzleInput = "great minds think alike" var puzzleOutput = "" let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "] for character in puzzleInput { if charactersToRemove.contains(character) { continue } else { puzzleOutput.append(character) } } print(puzzleOutput) // Prints "grtmndsthnklk"
break
- 전체 제어문의 실행을 즉각 중지
- let numberSymbol: Character = "三" // 중국어로 3을 의미하는 문자입니다. var possibleIntegerValue: Int? switch numberSymbol { case "1", "١", "一", "๑": possibleIntegerValue = 1 case "2", "٢", "二", "๒": possibleIntegerValue = 2 case "3", "٣", "三", "๓": possibleIntegerValue = 3 case "4", "٤", "四", "๔": possibleIntegerValue = 4 default: break } if let integerValue = possibleIntegerValue { print("The integer value of \\(numberSymbol) is \\(integerValue).") } else { print("An integer value could not be found for \\(numberSymbol).") }
fallthrough
switch는 case를 들어가면 break가 자동으로 됨, 하지만 fallthrough를 사용하면 break를 막음
let number = 5
var description = "The number \\(number) is"
switch number {
case 0:
description += " zero"
fallthrough
case 1..<5:
description += " between 1 and 5"
default:
description += " greater than or equal to 5"
}
print(description)
레이블 구문 (Labeled Statements)
label과 while을 넣어 특정 구문 실행
gameLoop: while square != finalSquare {
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
switch square + diceRoll {
case finalSquare:
// diceRoll will move us to the final square, so the game is over
break gameLoop // "gameLoop" 레이블을 사용하여 외부 while 루프를 종료
case let newSquare where newSquare > finalSquare:
// diceRoll will move us beyond the final square, so roll again
continue gameLoop // "gameLoop" 레이블을 사용하여 다시 while 루프의 맨 처음으로 이동
default:
// this is a valid move, so find out its effect
square += diceRoll
square += board[square]
}
}
print("Game over!")
이른 탈출 (Early Exit)
guard문을 사용하여 특정조건을 만족하지 않으면 코드 실행 되지 않음.
func greet(person: [String: String]) {
guard let name = person["name"] else {
return
}
print("Hello \\(name)!")
guard let location = person["location"] else {
print("I hope the weather is nice near you.")
return
}
print("I hope the weather is nice in \\(location).")
}
greet(person: ["name": "John"])
// Prints "Hello John!"
// Prints "I hope the weather is nice near you."
greet(person: ["name": "Jane", "location": "Cupertino"])
// Prints "Hello Jane!"
// Prints "I hope the weather is nice in Cupertino."
이용가능한 API 버전 확인 (Checking API Availability)
Swift에서는 기본으로 특정 플랫폼 (iOS, macOS, tvOS, watchOS)과 특정 버전을 확인하는 구문을 제공
이 구문을 활용해 특정 플랫폼과 버전을 사용하는 기기에 대한 처리를 따로 함.
if #available(platform name version, ..., *) {
statements to execute if the APIs are available
} else {
fallback statements to execute if the APIs are unavailable
}
실제 사용 (예)
if #available(iOS 10, macOS 10.12, *) {
// Use iOS 10 APIs on iOS, and use macOS 10.12 APIs on macOS
} else {
// Fall back to earlier iOS and macOS APIs
}
'기타 > Today I Learned' 카테고리의 다른 글
[TIL] Swift 문법 클로저(Closures) (0) | 2023.04.23 |
---|---|
[TIL] Swift 문법(함수 Functions) (1) | 2023.04.23 |
[TIL] Swift 문법(문자열과 문자) (0) | 2023.04.17 |
[TIL] 점근적 분석 & 사업계획서 (0) | 2023.03.29 |
[TIL] 기본 연산자(Basic Operators) & 데이터 구조 (0) | 2023.03.28 |