본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.
옵셔널 Optional
어제는 옵셔널을 추출하는 방법에 크게 네 가지가 있다고 했다. 강제 추출, 옵셔널 바인딩, 암시적 추출 옵셔널, 옵셔널 체이닝.
https://c-git-erg-sum.tistory.com/22
[TIL] 20201221: Naming, Optional, Split, Components
네이밍 Naming Avoid abbreviations: 축약어를 피하라! Abbreviations, especially non-standard ones, are effectively terms-of-art, because understanding depends on correctly translating them into their non-abbreviated forms. 축약어, 특히 비표
c-git-erg-sum.tistory.com
야곰 활동 학습을 하면서 하나를 더 알아냈다. 여기에 하나를 더하겠다. Nil 병합 연산자이다.
Nil 병합 연산자 Nil-Coalescing Operator
옵셔널 인스턴스가 nil일 경우, 연산자를 통해 default value를 설정해줄 수 있다. 옵셔널 뒤에 물음표(?) 두 개를 붙여 주고, 다른 옵셔널이나 default value를 적어준다. 다음과 같은 형태로 쓴다.
let 상수이름 = 옵셔널 ?? default value //default value는 말 그대로 디폴트값이다.
let 상수이름 = 옵셔널 ?? 옵셔널 ?? default value
다음의 예시를 보자.
let items = [1: "하네스", 2: "패딩", 3: "리드줄", 4: ""]
let defaultItem = "똥봉투"
let defaultNumber = 1
let one = items[5] ?? defaultItem
print(one) //똥봉투
let two = items[5] ?? items[6] ?? defaultItem
print(two) //똥봉투
let three = items[1] ?? items[5] ?? defaultItem
print(three) //하네스
let four = items[1]
print(four) //Optional("하네스")
let five = items[5] ?? "휴지"
print(five) //휴지
let six = items[5] ?? defaultNumber
print(six)
let seven = items[5] ?? 2
print(seven)
딕셔너리에서 키값(key)값을 통해 value를 꺼내오면 그 반환값은 기본적으로 옵셔널(Optional)이다. items[5]와 같은 것들은 nil이 될 수밖에 없기 때문이다. 이럴 때, let one = items[5] ?? defaultItem을 해주면, items[5]의 값은 nil이므로 defaultItem의 값을 one에 넣어준다. let two = ~의 예시처럼 옵셔널을 여러개 이어 써줘도 결과는 같다. 그런데, let three = ~ 의 예시를 보자. items[1]에 "하네스"라는 값이 있다. 그래서 seven에는 items[1]의 value인 "하네스"가 옵셔널에서 추출된 채 넣어지는 것이다. four에는 nil 병합 연산자를 사용해주지 않았기 때문에, Optional("하네스")가 출력된다. defaultItem이라는 상수를 써주지 않고, five에서처럼 "휴지"라고 직접적으로 default value를 넣어줄 수도 있다.
그런데, 조심해야할 점이 있다.
items[5]는 Optional<String>이다. 아마, 딕셔너리가 [Int: String]의 형태라서 그런 것 같다. 그래서 items[5]의 뒤에 ??를 붙이고 defaultNumber를 넣으려고 하면 'Cannot convert value of type 'Int' to expected argument type 'String''이라고 하는 것 같다. 마찬가지로 seven처럼 defaultNumber대신 숫자 2를 직접 입력해줘도 결과는 같다.
'YAGOM CAREER STARTER' 카테고리의 다른 글
[TIL] 20221227: git reset --hard, namespace, Implicitly Assigned Raw Values (0) | 2022.12.28 |
---|---|
[TIL] 20221226: 접근제어(캡슐화,은닉화) (0) | 2022.12.27 |
[토요스터디A반] 20221224: Optional, throws-throw, do-catch, try-try?-try!, Result (0) | 2022.12.24 |
[TIL] 20221223: Magic literal/number, Tuple, Recursive Function (0) | 2022.12.24 |
[TIL] 20221221: Naming, Optional, Split, Components (0) | 2022.12.21 |