
옵셔널과 에러처리의 다른 점은?
: 값의 존재 유무를 사용하여 함수의 성공 또는 실패를 전달
: nil을 반환하여 에러를 표현하므로 실패 원인을 알기 어려움
: 간단한 실패를 표현할 때 사용
func findFile(named filename: String) -> String? {
let files = ["data.txt", "image.png"]
return files.contains(filename) ? filename : nil // 파일이 있으면 반환, 없으면 nil
}
if let file = findFile(named: "data.txt") {
print("파일 찾음: \(file)")
} else {
print("파일을 찾을 수 없음.")
}
: 에러 원인을 판별 가능
: 다른 프로그램의 부분으로 전달도 가능
: throws 키워드를 사용해 함수가 에러를 발생시킬 수 있음을 나타냄
: do-try-catch 구문을 사용해 에러 발생 시 적절한 조치를 취할 수 있음
func canThrowAnError() throws {
// // 에러 발생 가능
}
do {
try canThrowAnError()
// 에러가 발생하지 않으면 정상 실행
} catch {
// 에러가 발생하면 여기로 옴
}
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich() //에러가 없으면 실행
} catch SandwichError.outOfCleanDishes {
washDishes() // 깨끗한 그릇이 없으면 설거지 실행
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients) // 재료가 없으면 장보기 실행
}
makeASandwich()
: 깨끗한 그릇울 사용할 수 없거나 재료가 없는 경우 에러 발생
try makeASandwich()
: 에러 발생 가능성이 있다는 것을 보여줌
catch SandwichError.outOfCleanDishes { washDishes() }
: 깨끗한 그릇을 사용할 수 없을 때 -> washDishes 함수 실행
catch SandwichError.missingIngredients(let ingredients) { buyGroceries(ingredients) }
: 재료가 없는 경우 -> buyGroceries(ingredients) 함수 실행