옵셔널 값을 추출(optional unwrapping) 방법에는 크게 2가지 명시적 해제와 묵시적 해제가 존재합니다.
보다 세분화해서 살펴보면 각각 강제 해제/비강제 해제, 비교연산자 이용 해제/! 이용 해제 등으로 작게 4가지 방법을 사용할 수 있습니다.
방법 하나하나 예시를 들어가며 살펴보겠습니다.
※ 주의! 본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.
반응형
■ 명시적 해제
1-1. 강제 해제 (force unwrapping)
옵셔널로 선언된 변수 뒤에 ‘!’를 붙여서 적용
'!'는 옵셔널 강제 해제 연산자
옵셔널 값을 추출하는 위험한 방법 → 값이 nil인 옵셔널을 강제로 해제할 경우, 값이 없으므로 런타임 오류가 발생하며 프로그램 강제종료될 가능성 존재
var someValue: Int? = 7 print(someValue) // 결과 : “Optional(7)\n” print(someValue!) // 결과 : “7\n”
1.2 비강제 해제 (=옵셔널 바인딩; optional binding)
강제 해제보다 안전한 방법
if-let 구문 활용가능 → 옵셔널을 추출하여 할당받은 변수(또는 상수) 이름 앞에 if-let 를 표기 → 만약 추출이 실패할 경우, else 구문 실행 → 여러 옵셔널 변수들을 쉼표(,)를 사용하여 한번에 바인딩 가능 (단, 옵셔널 바인딩한 값은 if 블록 내에서만 사용 가능. else 블록에서도 불가)
var someValue: Int? = 7
if let result = someValue { print(someValue) } // 결과 : “7\n”
guard-let 구문 활용 가능 → 옵셔널 값을 추출하여 할당할 변수(또는 상수) 이름 앞에 guard-let를 표기 → guard문 다음, 함수 전체 구문에서 추출된 변수나 상수 사용 가능 → guard문은 조건이 true일때만 guard문을 통과, false면 else구문을 실행시킨 뒤 종료
func someFunc() { let someValue: Int? = 7 guard let result = someValue else { return } print(result) }
someFunc() // 결과 : “7\n”
■ 묵시적 해제
2-1. 컴파일러에 의한 자동 해제
비교연산자를 사용
옵셔널을 비교연산자를 이용하여 다른값과 비교시 컴파일러가 옵셔널을 자동으로 해제
let someValue: Int? = 7
if someValue == 7 { print(“someValue는 7입니다.”) } else { print(“someValue는 7이 아닙니다.”) } // 결과 : “7\n”
2-2. 옵셔널의 묵시적 해제
값을 사용할때 자동으로 옵셔널이 해제가 되는 것
반환타입 뒤에 (옵셔널임을나타내는)?를 !로 변경하여묵시적옵셔널해제
일반값처럼 자유롭게 연산작업 가능
let thisYear = “2022”
<옵셔널 해제 없이 실행할 경우> var threeYearLater: Int? = Int(thisYear) // 결과 : 2022 print(threeYearLater + 3) // 결과 : 에러발생
<옵셔널의 묵시적 해제 적용할 경우 (? → ! 로 변경)> var threeYearLater: Int! = Int(thisYear) // 결과 : 2022 print(threeYearLater + 3) // 결과 : “2025\n”