NOW-ON / iOS-Interview-Preparation

iOS 면접 준비
3 stars 0 forks source link

Optional & Optional의 내부 구조 #12

Closed Glsme closed 1 year ago

Glsme commented 1 year ago

🗓️ 마감일

2023.01.22

💁 참여자

⚠️ 마지막으로 답변 단 사람이 이슈 close 하고 리드미에 항목 업데이트 해주세요.

LeeJoobang commented 1 year ago

Optional: 값이 있는 경우와 없는 경우 모두 포함하는 타입

Optional type의 내부구조

Yun-YeoJin commented 1 year ago

Optional 뜻

Optional 내부 구조

heydoy commented 1 year ago

Optional

@frozen enum Optional<Wrapped>

래핑된 값 또는 값이 없음을 뜻하는 nil 을 표현하는 타입

Optional 사용하기

let shortOptionalInt: Int? = Int("3")
let longOptionalInt: Optional<Int> = Int("3")

옵셔널 타입은 nil리터럴 에 해당하는 .none 타입과 래핑된 값을 저장하는 some(Wrapped)타입, 두가지 케이스로 이루어져 있다.

let catHere: String? = Optional.some("고양이")
let noneCat: String? = Optional.none

옵셔널 값을 사용하려면 값을 언래핑 해야한다.

Unwrapping Optional

Optional Binding

새 변수에 옵셔널 객체의 래핑된 값을 조건적으로 bind 한다. if let, guard let, switch 가 있다.

if let starHere = UIImage(named: "star") {
    print("이미지가 있음")
} else {
    print("이미지를 찾을 수 없음")
}

Optional Chaining

래핑된 개체의 프로퍼티와 메서드를 안전하게 접근하는 방법. 개체에 접미사로 ?를 붙이고 접근한다.

if cat?.isFull("catFood") == true {
    print("고양이가 배부르다")
}

Nil-Coalescing Operator

nil 병합 연산자 ??을 사용하여 옵셔널 객체가 nil일 경우 기본값을 제공한다.

let catFood = stock["catFood"] ?? "없음"
print(catFood)

?? 연산자는 다른 옵셔널 인스턴스를 오른쪽에 붙이는 식으로 여러개의 연산자를 체이닝하여 사용할 수 있다.

let catFood = stock["catFood"] ?? refrigerator["catFood"] ?? "진짜 없음"
print(catFood)

Unconditional Unwrapping 강제 언래핑

옵셔널 객체가 값을 가지고 있는 게 확실하다면 강제 해제 연산자 !을 이용하여 언래핑할 수 있다.

let catFoodCount = Int("30")!
print(catFoodCount)

옵셔널 체이닝 때도 강제 해제 연산자 !를 이용할 수 있다.

let hasChurr = cupboard.hasCatFood("츄르")
print(hasChurr)

nil 객체를 강제 해제할 경우 런타임 에러가 발생한다.

Glsme commented 1 year ago

nil을 사용할 수 있는 타입과, 사용할 수 없는 타입을 구분하기 위하여 사용하는 열거형.

nil 이란?

enum Optional<Wrapped> {
    case some(Any)
    case none
}



옵셔널값을 추출하는 방법

  1. 강제 추출 연산자를 붙여 강제로 옵셔널값을 추출
    
    let name: String? = "hano"

print(name!)

2. **if문으로 `nil`이 아님을 확인 후, 강제로 추출**
```swift
let name: String? = "hano"

if name != nil {
    print(name!)
}
  1. Optional Binding
    • 바인딩(상수나 변수에 대입)이 되는 경우만 특정 작업을 진행.
      
      if let n = name {
      print(n)
      }

func doSomething(name: String?) { // func에서만 사용가능 guard let n = name else { return } print(n) }

4. **Nil-Coalescing**
```swift
print(name ?? "신원미상")
  1. Optional Chaining
    • 표현식 자체가 옵셔널의 가능성이 있다는 것을 표현.
    • 체이닝의 결과는 항상 옵셔널이다.
      korea?.seoul?.jungGu
wodyddml2 commented 1 year ago

Optional

nil을 사용할 수 있는 타입과, 사용할 수 없는 타입을 구분하기 위하여 사용하는 열거형

Optional 내부 구조

enum 타입으로 이루어져 있음

Optional.none의 케이스로 값이 만들어진 것이 nil

Unwrapping Optional