try?와 try!
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 46번째.
때로는 함수가 어떤 에러를 던졌는지 상관하지 않고, 그저 결과나 폴백(fallback)을 원할 때가 있습니다. Swift는 두 가지 단축 형태를 제공합니다.
try?는 발생한 모든 에러를 nil로 바꿉니다. 결과는 함수의 반환 타입에 대한 Optional입니다:
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0인라인 기본값을 위해 ??와 결합하세요. 이것은 "이것을 호출하고, 어떤 방식이든 값을 달라"는 표현의 가장 짧은 버전입니다.
try!는 "이것은 에러를 던지지 않을 것임을 알고 있습니다"라고 말하는 것과 같습니다. 만약 에러가 발생하면 프로그램이 강제 종료됩니다. 호출이 안전하다는 것을 증명할 수 있을 때만 사용하세요. 일상적인 코드에서는 폴백(fallback)이 있는 try?나 전체 do/catch 구문을 사용하는 것을 권장합니다.
챌린지
쉬움하나의 케이스 bad를 가진 NumError: Error를 정의하세요. 그리고 다음을 수행하는 throwing 함수 parseEven(_ s: String) throws -> Int를 정의하세요:
s를Int로 파싱할 수 없거나, 파싱된 값이 홀수일 때.bad를 throw합니다.- 그렇지 않으면 파싱된 정수를 반환합니다.
쉼표로 구분된 문자열 리스트인 한 줄의 입력을 읽습니다. 각 문자열에 대해 try?와 ?? -1을 사용하여 파싱된 짝수 정수를 얻거나 -1을 얻도록 합니다.
결과 정수들을 ,로 연결하여 순서대로 출력합니다. 그런 다음 두 번째 줄에 -1로 반환된 값의 개수를 출력합니다.
입력이 4,7,abc,8,11,2인 경우, 출력은 다음과 같습니다:
4,-1,-1,8,-1,2
3치트 시트
try?는 발생한 에러를 nil로 변환하여 Optional을 반환합니다:
let result = try? risky() // 에러 발생 시 nil
let safe = (try? risky()) ?? 0 // 대체 값try!는 호출 시 에러가 발생하면 크래시가 발생합니다 — 호출이 안전하다고 보장되는 경우에만 사용하세요:
let value = try! guaranteedSafe()직접 해보기
let parts = readLine()!.components(separatedBy: ",")
// 할 일: enum NumError; func parseEven(_:) throws -> Int;
// 각 part에 대해, (try? parseEven(part)) ?? -1
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.