# Optional 다루기

Swift 언어에는 Optional 이라고 하는 개념이 있다. 정확하게는 Optional 타입이라는 것이 있다. TypeScript에서는 해당 타입의 값이 있을지 없을지 애매할 때 (보통 API로 조건에 맞는 데이터를 받아올 때) ?로 표기하는 타입이 Swift에서 Optional Type이라고 인지하면 편하다.

- nil이 담길 수 있는 타입이다. (nil은 값이 없다는 사실을 표현하는 키워드)

- 메모리에서 특정 변수에 값이 담기지 않아도 에러로 인식하지 않는 타입이다.

- Optional 타입의 값을 실제로 앱에서 사용하기 위해서는 반드시 Unwrapping 과정이 필요하다.

**Optional Unwrapping**

1. 강제로 값이 있음을 알려주기. (force unwrapping)

```javascript
var optionals: String?
optionals = "값 있음"
print(optionals!) // "값 있음"
```

- 말 그대로 강제로 해당 값이 있음을 개발자가 보장한다는 측면이기 때문에, 개발자의 오류로 런타임단의 에러가 발생할 여지가 있다.

- as 키워드로 특정 뷰 클래스의 인스턴스임을 타입 캐스팅 할 때, `as! SomeView` 형태로 강제할 때도 ! 키워드를 활용한다.

1. if 조건문으로 nil인지 아닌지를 체크하기

```javascript
var optionals: String?
optionals = "값 있음"

if optionals != nil {
    print(optionals!) // "값 있음"
}

optionals != nil ? print(optionals!) : print("값 없음")
```

- 1번에서 개발자의 오류를 삭제하는 가장 간단한 방법이다.

- 삼항 연산자 형태로도 조건에 따른 Optional한 값을 벗길 수 있다.

1. Optional Binding

```javascript
// 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이 바인딩 되지 않을 경우에 대한 조건식을 우선적으로 작성한다는 점이다.

1. Nil Coeracing

```javascript
var optionals: String?
optionals = "값 있음"

print(optionals ?? "") // "값 있음"
```

- Optional Type의 표현식 뒤에 해당 Optional이 nil일 경우 사용될 기본값을 제시하는 방법이다.

- 기본값을 제시할 수 있는 경우에만 사용되어야 한다.

1. Optional Chaining

```javascript
open var navigationController: UINavigationController? { get }

navigationController?.pushViewController(ViewController, animated: true)
```

- Optional하게 정의된 구조체, 클래스의 속성/메서드에 접근하여 사용할 경우에 ? 키워드로 nil 여부를 판단하게 시키는 방법이다.
- 

- 접근하고자하는 값 (?가 붙은 값)이 nil일 경우 . 접근자 뒤에 붙은 코드를 실행하지 않고, nil을 띄운다는 표현이다.

- 옵셔널 체이닝으로 반환된 값은 반드시 Optional한 값이다. ⇒ 즉, 해당 값은 반드시 unwrapping이 필요하다.

For the site tree, see the [root Markdown](https://slashpage.com/hankyeol.md).
