ํฐ์คํ ๋ฆฌ ๋ทฐ
์๋ ํ์ธ์? ๋๊ตฌ๋ฆฌ์ ๋๋ค.
์ค๋์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ๊ณต๋ถํด๋ณด๋ ค๊ณ ํด์.
์ฝ๋๋ฅผ ์ง๋ค ๋ณด๋ฉด ์๋ฌ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๊ณ ๋ฏผํ ๋๊ฐ ์์ฃผ ์์๋๋ฐ
์ด๋ฒ ๊ธฐํ์ ๋ค์ ํ ๋ฒ ์ ๋ฆฌํ๊ณ ํ๋ ค๊ณ ํด์
Swift์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
Swift์์ ์ค๋ฅ๋ Error๋ผ๋ ํ๋กํ ์ฝ์ ์ค์ํ๋ ํ์ ์ ๊ฐ์ผ๋ก ํํ๋ฉ๋๋ค.
๋ ์ด๊ฑฐํ์ ์ฌ์ฉํ์ฌ ์ค๋ฅ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ฉด ํจ์ฌ ํธ๋ฆฌํ๋ค๊ณ ํด์!
์ค์ํํธ ๊ณต์๋ฌธ์์์ ์ข์ ์๊ฐ ์์ด์ ๊ฐ์ ธ์๋ดค์ด์
enum VendingMachineError: Error {
case invalidSelection
case insufficientFunds(coinsNeeded: Int)
case outOfStock
}
์ํ๊ธฐ ์๋์ ๋ํ ์ค๋ฅ์ธ๋ฐ
์ด๋ฐ ํํ๋ก ์ฌ์ฉํ๋ค๋ ๊ฒ๋ง ์๊ณ ๋์ด ๊ฐ๊ฒ์!
Swift์์๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌ ํ๋ ๋ฐฉ๋ฒ์ด 4๊ฐ์ง๊ฐ ์์ด์!
- ํจ์์์ ๋ฐ์ํ ์ค๋ฅ๋ฅผ ํด๋น ํจ์๋ฅผ ํธ์ถํ ์ฝ๋์ ์๋ฆฌ๋ ๋ฐฉ๋ฒ
- do-catch ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ์ต์ ๋ ๊ฐ์ ์ด์ฉํ์ฌ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์๊ฒ์ด๋ผ ํ๋จํ๋ ๋ฐฉ๋ฒ
์ฐจ๋ก๋๋ก ์์๋ณผ๊ฒ์!!
ํจ์์์ ๋ฐ์ํ ์ค๋ฅ๋ฅผ ํด๋น ํจ์๋ฅผ ํธ์ถํ ์ฝ๋์ ์๋ฆฌ๋ ๋ฐฉ๋ฒ
์ค์ํํธ ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด
ํจ์์์ ์ค๋ฅ๋ ๋์ง๊ธฐ ํจ์ throws๋ฅผ ์ฌ์ฉํด์ ๋ํ๋ผ ์ ์์ต๋๋ค!
ํ๋ผ๋ฏธํฐ ๋ค ํจ์ ์ ์ธ์ throws ํค์๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
๋ผ๊ณ ๋์ ์๋๋ฐ์!
๋์ง๊ธฐ ํจ์...?
์ค๋ฅ๋ฅผ ์ ๋ฌํ๋ค๋ ์๋ฏธ์ธ๊ฒ ๊ฐ์๋ฐ
์ ๋ฌํ์ผ๋ฉด ๋ฐ์์ผ๊ฒ ์ฃ ?
๋ฐ๋ก try ํค์๋๋ฅผ ํตํด ๋์ ธ์ง ์ค๋ฅ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
์ด๋ป๊ฒ ์ค๋ฅ๋ฅผ ๋์ง๊ณ ๋ฐ๋์ง ๊ณต์๋ฌธ์์ ์๋ฌธ์ ํตํด ์์๋ณผ๊ฒ์~
๋จผ์ throw์ ์ฌ์ฉ๋ฒ์ ๋๋ค!
// ์ค๋ฅ๋ฅผ ์ ๋ฌํ ์ ์์
func canThrowErrors() throws -> String
// ์ค๋ฅ๋ฅผ ์ ๋ฌํ ์ ์์
func cannotThrowErrors() -> String
์ค๋ช ๋๋ก ํจ์์ ๋งค๊ฐ๋ณ์ ๋ค์ throws ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด
ํจ์ ๋ด์์ ์ค๋ฅ๋ฅผ ์ ๋ฌํด์ค ์ ์์ต๋๋คใ ใ ใ
๋น์ฐํ ์ด์ผ๊ธฐ์ด์ง๋ง throws๋ฅผ ์ฌ์ฉํ ํจ์๋ง ์ค๋ฅ ์ ๋ฌ์ด ๊ฐ๋ฅํฉ๋๋ค!!
class VendingMachine {
var inventory = [
"Candy Bar": Item(price: 12, count: 7),
"Chips": Item(price: 10, count: 4),
"Pretzels": Item(price: 7, count: 11)
]
var coinsDeposited = 0
func vend(itemNamed name: String) throws {
guard let item = inventory[name] else {
throw VendingMachineError.invalidSelection
}
guard item.count > 0 else {
throw VendingMachineError.outOfStock
}
guard item.price <= coinsDeposited else {
throw VendingMachineError.insufficientFunds(coinsNeeded: item.price - coinsDeposited)
}
coinsDeposited -= item.price
var newItem = item
newItem.count -= 1
inventory[name] = newItem
print("Dispensing \(name)")
}
}
let favoriteSnacks = [
"Alice": "Chips",
"Bob": "Licorice",
"Eve": "Pretzels",
]
func buyFavoriteSnack(person: String, vendingMachine: VendingMachine) throws {
let snackName = favoriteSnacks[person] ?? "Candy Bar"
try vendingMachine.vend(itemNamed: snackName)
}
๊ณต์๋ฌธ์์ ์๋ฌธ์ ๋๋ค!
VendingMachine์ vend(itemNamed:)๋ฉ์๋๋ฅผ ๋ณด๋ฉด throws๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ
์ ๋ฌํ ์ ์๋ ํจ์๋ก ์ ์ธ๋์ด ์์ต๋๋ค.
์ด ํจ์ ๋ด๋ถ์์๋ guard๋ฌธ์ ํตํด ์ค๋ฅ๊ฐ ์ผ์ผํฌ ๋งํ ์ฌํญ๋ค์ ์ฒดํฌํ๊ณ
์ค๋ฅ์ธ ์ํฉ์ด ๋ฐ์ํ๋ค๋ฉด ํจ์๋ฅผ ์กฐ๊ธฐ์ข ๋ฃ ์ํจ ํ
์๋ฌ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋ณผ ์ ์์ด์!!
๋ buyFavoriteSnack์ ๋ณด๋ฉด vend(itemNamed:)ํจ์๋ฅผ ํธ์ถํ๋ ํํ์์
vend๋ฉ์๋๊ฐ ์ค๋ฅ๋ฅผ ์ ๋ฌํ ์ ์๋ ์น๊ตฌ๋๊น
๋ง์ฝ์ ์ค๋ฅ๊ฐ ์ ๋ฌ๋๋ค๋ฉด
buyFavoriteSnack๋ฉ์๋๋ ์ค๋ฅ๋ฅผ ์ ๋ฌํ ์ ์์ด์ผ๊ฒ ์ฃ ?ใ ใ
๊ทธ๋์ buyFavoriteSnack๊ฐ throws๋ฅผ ์ฌ์ฉํด์ ์ ์ธ์ด ๋๊ฒ์ ๋๋ค!!
do-catch๋ฌธ์ ์ฌ์ฉํ์ฌ ์ค๋ฅ์ฒ๋ฆฌ
์ง๊ธ๊น์ง ์ค๋ฅ๋ฅผ ์ด์ฌํ ๋์ง๊ธฐ๋ง ํ๋๋ฐ์..ใ
์ด๋ฒ์๋ ๋์ ธ์ง ์ค๋ฅ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌ๋ฅผ ํด๋ณผ๊ฒ์!
์ด๋ ์ฌ์ฉํ๋ ๊ตฌ๋ฌธ์ด do-catch๋ฌธ์ธ๋ฐ์~~
๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ด ์์ผ์๋ค๋ฉด ์ต์ํ ๊ตฌ๋ฌธ์ ๋๋คใ ใ
๋จผ์ ์ฌ์ฉํ๋ ํํ๋ฅผ ํ์ธํด ๋ณผ๊ฒ์!
๋ญ๊ฐ switch๋ฌธ๊ณผ ๋น์ทํ์ง ์๋์?ใ ใ (๋๋ง ๊ทธ๋ฐ๊ฐ..ใ )
์ค๋ฅ๋ฅผ ์ ๋ฌํ๋ ํ๋ก์ฐ๋
do ๋ด๋ถ์์ ์ค๋ฅ ์ ๋ฌ -> catch๋ฌธ์์ ์ค๋ฅ๋ฅผ ์ ๋ฌ๋ฐ์ ์ฒ๋ฆฌ
ํํ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค!!
๊ทธ๋ผ ๊ณต์๋ฌธ์์ ์๋ฌธ์ ๋ณผ๊ฒ์!
var vendingMachine = VendingMachine()
vendingMachine.coinsDeposited = 8
do {
try buyFavoriteSnack(person: "Alice", vendingMachine: vendingMachine)
print("์ฑ๊ณต")
} catch VendingMachineError.invalidSelection {
print("invalid selection")
} catch VendingMachineError.outOfStock {
print("out of stock")
} catch VendingMachineError.insufficientFunds(let coinsNeeded) {
print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.")
} catch {
print("Unexpected error: \(error).")
}
// Prints "Insufficient funds. Please insert an additional 2 coins."
์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ๋ ํ๋ก์ฐ๋ฅผ ์ดํด ๋ณผ๊ฒ์!
๋จผ์ throws๋ฅผ ์ฌ์ฉํ๋ buyFavoriteSnack๋ฉ์๋๋ ์๋ฌ๋ฅผ ๋์ง ์ ์์ผ๋๊น
try๋ฅผ ์ฌ์ฉํด์ ํธ์ถํ์ต๋๋ค.
์ดํ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด success๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ๊ณ
์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด VendingMachineError์ ๊ด๋ จ๋ ์๋ฌ์
๊ทธ ์ด์ธ์ ์๋ฌ์ ๋ํด ์ฒ๋ฆฌ๋๋๋ก ์์ฑํ์ด์!
๋ณด๋ฉด ๋ณผ์๋ก switch๋ฌธ์ด๋ ๋น์ทํด์ ํฌ๊ฒ ์ด๋ ต์ง ์์์!!ใ ใ
Optional ๊ฐ์ ์ด์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
์ด๋ฒ์ ์ต์ ๋ ๊ฐ์ ์ฌ์ฉํด์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ๊ฒ์!!
์ด ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ฐ์
๋ฐ๋ก try ๋ค์ ์ต์ ๋์ ๋ถ์ฌ์ try? ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.~!
์ด๋ ๊ฒ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ nil์ ๋ฐํํ๊ฒ ๋๋ ํํ๋ฅผ ๊ฐ์ง๋๋ค!!
๋ฐ๋ก ์๋ฌธ์ ์ดํด๋ณด์ฃ ~
func someThrowingFunction() throws -> Int {
// ...
}
let x = try? someThrowingFunction()
let y: Int?
do {
y = try someThrowingFunction()
} catch {
y = nil
}
๊ตฌ๋ฌธ์ ๋ณด๋ฉด
x์ y๋ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ nil์ ๋ฐํํ๊ฒ ๋๊ณ
์๋๊ฒฝ์ฐ Int๊ฐ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋คใ ใ
์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ ํ๋จํ๋ ๋ฐฉ๋ฒ
์ ์ด๋ฒ ๋ฐฉ๋ฒ์ ์กฐ๊ธ ์ํํ ๋ฐฉ๋ฒ์ด๊ธด ํ๋ฐ์
๋ฐ๋ก try!๋ฅผ ์ฌ์ฉํด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฌ์ฉ๋ฒ์ ์์ ๊ตฌ๋ฌธ์ด๋ ๋๊ฐ์ต๋๋ค!
์ต์ ๋์ ๊ฐ์ ๋ก unwrappingํ ๋ nil์ด๋ฉด ๋ฐํ์ ์ค๋ฅ๋ก ์ธํด์ ๊ฐ์ ์ข ๋ฃ๊ฐ ๋์์ฃ ?
์ด๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ง์ฝ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ
๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋คใ ใ ใ
์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํด์(๋น์ถ๋น์ถ!!!)
ํ์ฒ๋ฆฌ defer
์ถ๊ฐ์ ์ผ๋ก ์ฝ๋ ๋ธ๋ก์ ๋๊ฐ๊ธฐ ์ ์ ๊ผญ ์คํํด์ผ ํ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด
defer๋ฅผ ํตํด ๊ตฌํํ ์ ์์ต๋๋ค.
๋ฐ๋ก ์๋ฌธ ํ์ธํด ๋ณผ๊ฒ์!!
func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
while let line = try file.readline() {
// Work with the file.
}
// close(file) is called here, at the end of the scope.
}
}
defer๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๋ง๋
์ฝ๋ ์ํ์ด ๋ง๋ฌด๋ฆฌ ๋ ๋ ์คํ์ด ๋๋๋ฐ์!
์๋ฌธ์ ํจ์๋ฅผ ๋ณด๋ฉด ํ์ผ์ ์ฌ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋๋ฐ
๊ฐ๋ฐ์๊ฐ ํ์ผ์ ์ด์๋ค๊ฐ ์ค์๋ก ๋ซ์ง ์์ ์ ์์์์?ใ
๊ทธ๋ด๋ defer๋ฌธ์ ์ฌ์ฉํด์ ํจ์๊ฐ ๋๋ ๋ ์ด๋ฆฐ ํ์ผ์ ๋ซ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋คใ ใ
์ค๋ฅ ์ฒ๋ฆฌ๋ฟ๋ง ์๋๋ผ ์ผ๋ฐ์ ์ธ ์ํฉ์์๋ ์ฌ์ฉํ ์ ์์ด์!!
(๋๋ฌด ์ข๋ค..ใ )
defer๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๋๋ ์ฃผ์ํ ์ ์ด ์์ด์
๋ฐ๋ก defer๊ตฌ๋ฌธ์ break๋ return์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ defer๋ธ๋ญ์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ ๋งจ ๋ง์ง๋ง ๋ธ๋ญ๋ถํฐ ์ญ์์ผ๋ก ์คํ๋ฉ๋๋ค!!
์ค๋์ swift์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์๋๋ฐ์!!
๊ฐ๋ฐ์์ธ ์ ์ ๋์ ๋งํผ ์๋ฌ ์ฒ๋ฆฌ์ ๋ํด์๋ ์ ๋์์ ํด์ผํ๋๋ฐ
์ด๋ฒ ๊ณต๋ถ์๊ฐ์ ํตํด์ ๊ทธ๋ฐ ๋์ ๋ฅ๋ ฅ์ ํค์ธ ์ ์์๋๊ฒ ๊ฐ์์!!
๊ธ ๋ณด์ ๋ถ๋ค์๊ฒ๋ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๊ธ ์ฝ์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋คใ ใ
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- Swift Network
- observable
- test
- ios
- RxSwift
- ์คํ ๋ ์ด์์
- RX
- swift ํ๋กํ ์ฝ
- ์ค์ํํธ ํ๋กํ ์ฝ
- Property
- swift urlsession
- network
- Protocol
- ๊ณต๋ถ
- func
- swift ๊ณต๋ถ
- URLSession
- Unit Test
- ํ ์คํธ
- ์ค์ํํธ
- XCTest
- set
- swift
- ์ค์ํํธ map
- autolayout
- ํ๋กํผํฐ
- ์ค์ํํธ ๊ณต๋ถ
- Clean
- xcode
- ํ๋กํ ์ฝ
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |