λ°μν
μλ¬μ νμμ λ°μ
enum VendingMachineError: Error {
case invalidSelection
case insufficientFunds(coinsNeeded: Int)
case outOfStock
}
throw VendingMachineError.insufficientFunds(coinsNeeded: 5)
μλ¬ μ²λ¦¬
- μλ¬κ° λ°μν ν¨μμμ 리ν΄κ°μΌλ‘ μλ¬λ₯Ό λ°νν΄ ν΄λΉ ν¨μλ₯Ό νΈμΆν μ½λμμ μλ¬λ₯Ό μ²λ¦¬νλλ‘ νλ λ°©λ²
- do-catch ꡬ문μ μ¬μ©νλ λ°©λ²
- μ΅μ λ κ°μ λ°ννλ λ°©λ²
- assertλ₯Ό μ¬μ©ν΄ κ°μ λ‘ ν¬λμ¬λ₯Ό λ°μμν€λ λ°©λ²
μλ¬λ₯Ό λ°μμν€λ ν¨μ μ¬μ©νκΈ°
μ΄λ€ ν¨μ, λ©μλ νΉμ μμ±μκ° μλ¬λ₯Ό λ°μμν¬ μ μλ€λ κ²μ μ리기 μν΄ throw ν€μλλ₯Ό ν¨μ μ μΈλΆμ νλΌλ―Έν° λ€μ λΆμΌ μ μμ
func canThrowErrors() throws -> String
func cannotThrowErrors() -> String
struct Item {
var price: Int
var count: Int
}
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)
}
struct PurchasedSnack {
let name: String
init(name: String, vendingMachine: VendingMachine) throws {
try vendingMachine.vend(itemNamed: name)
self.name = name
}
}
do-catchλ₯Ό μ΄μ©ν΄ μλ¬λ₯Ό μ²λ¦¬νκΈ°
do {
try expression
statements
} catch pattern 1 {
statements
} catch pattern 2 where condition {
statements
} catch {
statements
}
var vendingMachine = VendingMachine()
vendingMachine.coinsDeposited = 8
do {
try buyFavoriteSnack(person: "Alice", vendingMachine: vendingMachine)
print("Success! Yum.")
} 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."
func nourish(with item: String) throws {
do {
try vendingMachine.vend(itemNamed: item)
} catch is VendingMachineError {
// λͺ¨λ VendingMachineError ꡬλΆμ μν΄ isλ₯Ό μ¬μ©
print("Invalid selection, out of stock, or not enough money.")
}
}
do {
try nourish(with: "Beet-Flavored Chips")
} catch {
print("Unexpected non-vending-machine-related error: \\(error)")
// μ¬κΈ°μμ μ²λΌ catchλ₯Ό κ·Έλ₯ if-elseμμ else κ°μ΄ μ¬μ© κ°λ₯
}
// Prints "Invalid selection, out of stock, or not enough money."
μλ¬λ₯Ό μ΅μ λ κ°μΌλ‘ λ³ννκΈ°
func someThrowingFunction() throws -> Int {
// ...
}
let x = try? someThrowingFunction()
let y: Int?
do {
y = try someThrowingFunction()
} catch {
y = nil
}
func fetchData() -> Data? {
if let data = try? fetchDataFromDisk() { return data }
if let data = try? fetchDataFromServer() { return data }
return nil
}
μλ¬ λ°μμ μ€μ§νκΈ°
- ν¨μλ λ©μλμμ μλ¬κ° λ°μλμ§ μμ κ²μ΄λΌκ³ νμ νλ κ²½μ° try!λ₯Ό μ¬μ©ν μ μμ
- let photo = try! loadImage(atPath: "./Resources/John Appleseed.jpg")
μ 리 μ‘μ κΈ°μ
- defer ꡬ문μ μ΄μ©ν΄ ν¨μκ° μ’ λ£ λ ν νμΌ μ€νΈλ¦Όμ λ«κ±°λ, μ¬μ©νλ μμμ ν΄μ§ νλ λ±μ μΌμ ν μ μμ
- deferκ° μ¬λ¬κ°κ° μλ κ²½μ° κ°μ₯ λ§μ§λ§ μ€λΆν° μ€ν λ©λλ€. μ¦ bottom-up μμΌλ‘ μ€ν
func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file) // blockμ΄ λλκΈ° μ§μ μ μ€ν, μ£Όλ‘ μμ ν΄μ λ μ μ§μ μ¬μ©
}
while let line = try file.readline() {
// Work with the file.
}
// close(file) is called here, at the end of the scope.
}
}
λ°μν
'β¨οΈ Language > swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] μ λ€λ¦ (0) | 2024.04.02 |
---|---|
[Swift] νλ‘ν μ½ (0) | 2024.03.29 |
[Swift] μ΅μ λ 체μ΄λ (0) | 2024.03.26 |
[Swift] μ΄κΈ°ν (1) | 2024.03.25 |
[Swift] μμ (0) | 2024.03.22 |