Optional 다루기

Created by
  • 한결
Swift 언어에는 Optional 이라고 하는 개념이 있다. 정확하게는 Optional 타입이라는 것이 있다. TypeScript에서는 해당 타입의 값이 있을지 없을지 애매할 때 (보통 API로 조건에 맞는 데이터를 받아올 때) ?로 표기하는 타입이 Swift에서 Optional Type이라고 인지하면 편하다.
Optional Type의 특성
Optional Type의 값을 사용하는 방법
Optional Unwrapping
1.
강제로 값이 있음을 알려주기. (force unwrapping)
var optionals: String? optionals = "값 있음" print(optionals!) // "값 있음"
말 그대로 강제로 해당 값이 있음을 개발자가 보장한다는 측면이기 때문에, 개발자의 오류로 런타임단의 에러가 발생할 여지가 있다.
as 키워드로 특정 뷰 클래스의 인스턴스임을 타입 캐스팅 할 때, as! SomeView 형태로 강제할 때도 ! 키워드를 활용한다.
2.
if 조건문으로 nil인지 아닌지를 체크하기
var optionals: String? optionals = "값 있음" if optionals != nil { print(optionals!) // "값 있음" } optionals != nil ? print(optionals!) : print("값 없음")
1번에서 개발자의 오류를 삭제하는 가장 간단한 방법이다.
삼항 연산자 형태로도 조건에 따른 Optional한 값을 벗길 수 있다.
3.
Optional Binding
// if-let binding var optionals: String? optionals = "값 있음" if let v = optionals { print(v) // "값 있음" } // guard-let binding var optionals: String? optionals = "값 있음" guard let v = optionals else { // v가 nil일 경우 로직 } print(v) // "값 있음"
나는 개념의 이름처럼 Optional Type의 값을 어떠한 것에 binding 시키겠다는 의미로 해석했다.
if-let 구문
if 조건문과 거의 비슷하나, Optional한 값을 상수로 다룰 수 있다. (바인딩)
바인딩 된 경우에만 조건 스코프를 실행시킨다는 의미이기 때문에 활용도가 높다.
guard let 구문과 다르게 식에서 선언한 상수는 스코프 밖에서 핸들링 할 수 없다.
guard-let 구문
if-let 구문과 비슷하게 사용되지만, 바인딩된 let 상수를 스코프 밖에서 핸들링 할 수 있다.
Optional이 바인딩 되지 않을 경우에 대한 조건식을 우선적으로 작성한다는 점이다.
4.
Nil Coeracing
var optionals: String? optionals = "값 있음" print(optionals ?? "") // "값 있음"
Optional Type의 표현식 뒤에 해당 Optional이 nil일 경우 사용될 기본값을 제시하는 방법이다.
기본값을 제시할 수 있는 경우에만 사용되어야 한다.
5.
Optional Chaining
open var navigationController: UINavigationController? { get } navigationController?.pushViewController(ViewController, animated: true)
Optional하게 정의된 구조체, 클래스의 속성/메서드에 접근하여 사용할 경우에 ? 키워드로 nil 여부를 판단하게 시키는 방법이다.
접근하고자하는 값 (?가 붙은 값)이 nil일 경우 . 접근자 뒤에 붙은 코드를 실행하지 않고, nil을 띄운다는 표현이다.
옵셔널 체이닝으로 반환된 값은 반드시 Optional한 값이다. ⇒ 즉, 해당 값은 반드시 unwrapping이 필요하다.