☝🏻 옵셔널을 사용할 때는 강제 추출 또는 암시적 추출 옵셔널을 사용하기 보다는 **`옵셔널 바인딩`, `nil 병합 연산자`, `옵셔널 체이닝`** 등의 방법을 사용하는 편이 훨씬 안전
1. 옵셔널 사용
let primary = School(rawValue: "유치원")
- 변수나 상수를 선언할 때, 데이터 타입을 명시하지 않으면 타입 추론 사용하게 됨
- 이때 타입이 Optional 타입으로 추론되게 됨
2. 옵셔널 추출
☝🏻 옵셔널을 사용할 때는 강제 추출 또는 암시적 추출 옵셔널을 사용하기보다는 옵셔널 바인딩, nil 병합 연산자, 옵셔널 체이닝 등의 방법을 사용하는 편이 훨씬 안전
# 강제 추출
- 옵셔널 값의 뒤에 느낌표를 붙여주면 값을 강제로 추출하여 반환
- 런타임 오류의 가능성을 항상 내포하기 때문에 옵셔널 강제 추출 방식 사용은 지양
# 옵셔널 바인딩
- 옵셔널에 값이 있는지 확인할 때 사용
- 옵셔널에 값이 있다면 옵셔널에서 추출한 값을 일정 블록 안에서 사용할 수 있는 상수나 변수로 할당해서 옵셔널이 아닌 형태로 사용할 수 있도록 해줌
if let name = myName{
..
}else{
..
}
if var name = myName{
..
}else{
..
}
-
if 구문을 실행하는 블록 안쪽에서만 name이라는 임시 상수 사용 가능
-
if 블록 밖에서는 사용할 수 없고, else 블록에서도 사용 불가능
-
옵셔널 바인딩을 통해 한 번에 여러 옵셔널의 값을 추출할 수도 있음
-
쉼표를 사용해 바인딩 할 옵셔널을 나열하면 됨
-
이때 바인딩하려는 옵셔널 중 하나라도 값이 없으면 해당 블록 내부의 명령문은 실행되지 않음
if let name = myName, let friend = yourName {
..
}
# 암시적 추출 옵셔널
- nil을 할당하고 싶지만, 옵셔널 바인딩으로 매번 값을 추출하기 귀찮거나 로직상 nil 때문에 런타임 오류가 발생하지 않을 것 같다는 확신이 들 때 사용
- 타입 뒤에
느낌표(!)를 사용하면 됨
- 암시적 추출 옵셔널로 지정된 타입은 일반 값처럼 사용할 수 있으나, 여전히 옵셔널이기 때문에 nil도 할당 가능
- 그러나 nil이 할당되어 있을 때 접근을 시도하면 런타임 오류가 발생
var myName: String = "yagom"
myName = nil
if let name = myName{
..
}
by. 스위프트 프로그래밍 3판