// 두 표현식은 에러를 Optinal 값으로 변경한다 그래서 보통 Optional Binding과 함께 사용한다.
enum DataParsingError: Error {
case invalidType
case invalidField
case missingRequiredField(String)
}
func parsing(data: [String: Any]) throws {
guard let _ = data["name"] else {
throw DataParsingError.missingRequiredField("name")
}
guard let _ = data["age"] as? Int else {
throw DataParsingError.invalidType
}
// Parsing
}
// 파싱 데이터 함수는 값을 리턴하지 않기 때문에 wardCard pattern으로 값을 생략
if let _ = try? parsing(data: [:]) {
print("success")
} else {
print("fail")
}
// do-catch
do {
try parsing(data: [:])
print("success")
} catch {
print("fail")
}
// Optional try를 사용할때 반드시 Optinal binding으로 해야하는 것은 아니다
// 그냥 함수만 호출하고 결과는 신경쓸 필요가 없다면
// 이렇게 함수만 작성해도 된다.
try? parsing(data: [:])
// forced try
// try! parsing(data: ["name":"stave", "age": 33])
// 에러를 다른 곳에 전달할 수 없다.
// do-catch도 쓸 수 없다. : 에러 발생시 프로그램이 강제 종료되기 때문에 -> 가능하다면 사용하지 않는게 좋다
try! parsing(data: [ : ])