Menu
Coddy logo textTech

try?와 try!

Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨. 56개 중 46번째.

때로는 함수가 어떤 오류를 발생시켰는지 신경 쓰지 않고, 단지 결과나 대체값을 원할 때가 있습니다. 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!는 "이 코드가 예외를 발생시키지 않는다는 것을 알고 있어"라고 말합니다. 예외가 발생하면 프로그램이 중단됩니다. 호출이 안전하다는 것을 증명할 수 있을 때만 사용하세요. 일반적인 코드에서는 대체 값과 함께 try?를 사용하거나 전체 do/catch 구문을 사용하는 것이 좋습니다.

challenge icon

챌린지

쉬움

하나의 bad case를 가진 NumError: Error를 정의하세요. 다음과 같은 throwing parseEven(_ s: String) throws -> Int를 정의하세요:

  • sInt로 파싱할 수 없거나 파싱된 값이 홀수이면 .bad를 throw합니다.
  • 그렇지 않으면 파싱된 정수를 반환합니다.

입력에서 한 줄을 읽으세요. 입력은 쉼표로 구분된 문자열 목록입니다. 각 문자열에 try??? -1을 차례로 사용하여 파싱된 짝수 또는 -1을 얻으세요.

결과 정수들을 ,로 연결하여 순서대로 출력하세요. 그런 다음 두 번째 줄에 -1로 반환된 값의 개수를 출력하세요.

입력이 4,7,abc,8,11,2인 경우 출력은 다음과 같습니다:

4,-1,-1,8,-1,2
3

직접 해보기

let parts = readLine()!.components(separatedBy: ",")

// TODO: enum NumError; func parseEven(_:) throws -> Int;
// 각 part에 대해, (try? parseEven(part)) ?? -1
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨

직접 연습해 보세요: Swift 플레이그라운드