공식문서를 참고해서 Optional
에 대해서 정리해보자
매번 볼때마자 적응 안되는 Apple의 공식 문서..
원형
@frozen enum Optional<Wrapped>
차근차근 해석해보자
- @frozen
: 짧게 설명하자면 나중에 새로운 case가 추가 되지 않는걸 약속한다는 의미이다!
- enum
: 열거형으로 선언되어있다.
- Optional<Wrapped>
: Optional 로 감싸줄 데이터를 Wrapped자리에 작성해주면 된다.
개요
그렇다면 Optional 이란 무엇일까?
보통 값이 있을수도 있고 없을수도 있는 값을 우리는 Optional 이라고 말한다.
있을수도 있고 없을수도 있는 값을 Optional 이라는 케이스로 감싸준다고 생각하면 좋을 것 같다.
아래의 코드 샘플은 동일한 역할을 합니다.
let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")
Optional 에 열거형 종류에는 두 가지 케이스가 있습니다.
let number: Int? = Optional.some(42)
let noNumber: Int? = Optional.none
print(noNumber == nil)
// Prints "true"
많은 맥락에서 Optional 을 사용하기위에서는 반드시 Unwrap 후 사용을 해야합니다.
Swift는 여러가지 Optional을 Unwrap하는 방법을 제공합니다.
아래의 나올 예제들은 다음의 dictionary를 사용합니다.
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
딕셔너리 값은 키를 사용해 값을 가져올때 Optional 값을 return 한다는 군요. 처음 안 사실..
주의할 점은 nil이 지정된 경우엔 절대 해제하면 안됨!!
Optional Binding
인스턴스의 래핑된 값을 새 변수에 조건부로 바인딩 하려면
if let
, guard let
, switch
, while
중 하나를 선택하여 사용해야 한다.
1. if let
- if let은 분기처리 할때 유용하게 쓰인다.
- Unwraping된 값은 loop안에서만 사용가능
if let starPath = imagePaths["star"] {
print("The star image is at '\(starPath)'")
} else {
print("Couldn't find the star image")
}
// Prints "The star image is at '/glyphs/star.png'
// 만약 그냥 key에 접근해서 값을 출력한다면?
print("(imagePaths["star"])")
// "Optional("/glyphs/star.png")\n"
2. guard let
- guard let은 예외처리할 때 유용
- Unwraping된 값은 loop 밖에서만 사용가능
func optionalBinding() {
guard let starPath = imagePaths["star"] else {
print("Binding Fail")
return
}
print(starPath)
}
// "/glyphs/star.png\n"
3. switch
let optionalInt = Optional(11)
switch optionalInt {
case 0:
print("0")
case 11:
print("11")
default:
print("nil")
}
4.while
while let starPath = imagePaths["star"] {
print(starPath)
break
}
//"/glyphs/star.png\n"
상황에 맞춰 여러가지 방법을 활용해 옵셔널 바인딩을 사용하면 좋을 것 같다.
이제는 옵셔널이 무섭지 않다!!
참고자료
'Swift' 카테고리의 다른 글
Swift - 컴플리션 핸들러를 async로 감싸기 (0) | 2024.01.22 |
---|---|
Swift - 타입 캐스팅 톺아보기 (0) | 2023.12.29 |
Swift - [weak self] 톺아보기 (0) | 2023.12.21 |
Swift - ARC 톺아보기 (0) | 2023.12.14 |
iOS 공부하는 중🌱