Closed Glsme closed 1 year ago
Optional: 값이 있는 경우와 없는 경우 모두 포함하는 타입
Optional type의 내부구조
enum Optional<Wrapped> {
case some(Any)
case none
}
@frozen enum Optional<Wrapped>
래핑된 값 또는 값이 없음을 뜻하는 nil
을 표현하는 타입
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
옵셔널 값을 사용하려면 값을 언래핑 해야한다.
새 변수에 옵셔널 객체의 래핑된 값을 조건적으로 bind 한다. if let
, guard let
, switch
가 있다.
if let starHere = UIImage(named: "star") {
print("이미지가 있음")
} else {
print("이미지를 찾을 수 없음")
}
래핑된 개체의 프로퍼티와 메서드를 안전하게 접근하는 방법. 개체에 접미사로 ?
를 붙이고 접근한다.
if cat?.isFull("catFood") == true {
print("고양이가 배부르다")
}
nil 병합 연산자 ??
을 사용하여 옵셔널 객체가 nil일 경우 기본값을 제공한다.
let catFood = stock["catFood"] ?? "없음"
print(catFood)
??
연산자는 다른 옵셔널 인스턴스를 오른쪽에 붙이는 식으로 여러개의 연산자를 체이닝하여 사용할 수 있다.
let catFood = stock["catFood"] ?? refrigerator["catFood"] ?? "진짜 없음"
print(catFood)
옵셔널 객체가 값을 가지고 있는 게 확실하다면 강제 해제 연산자 !
을 이용하여 언래핑할 수 있다.
let catFoodCount = Int("30")!
print(catFoodCount)
옵셔널 체이닝 때도 강제 해제 연산자 !
를 이용할 수 있다.
let hasChurr = cupboard.hasCatFood("츄르")
print(hasChurr)
nil 객체를 강제 해제할 경우 런타임 에러가 발생한다.
enum Optional<Wrapped> {
case some(Any)
case none
}
let name: String? = "hano"
print(name!)
2. **if문으로 `nil`이 아님을 확인 후, 강제로 추출**
```swift
let name: String? = "hano"
if name != nil {
print(name!)
}
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 ?? "신원미상")
korea?.seoul?.jungGu
nil을 사용할 수 있는 타입과, 사용할 수 없는 타입을 구분하기 위하여 사용하는 열거형
enum 타입으로 이루어져 있음
Optional.none의 케이스로 값이 만들어진 것이 nil
🗓️ 마감일
2023.01.22
💁 참여자
⚠️ 마지막으로 답변 단 사람이 이슈 close 하고 리드미에 항목 업데이트 해주세요.