열거형// 아래는 모두 같은 의미의 표현
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil
//일반 상수에 nil을 넣으려는 경우 오류 발생
//let someConstant: Int = nil
옵셔널 바인딩 : if let / guard let 구문을 사용해 값이 없으면(nil) else블록 실행
해당 코드블록 안에서만 사용할 때 사용func printName(_ name: String) {
print(name)
}
var myName: String? = nil
if let name: String = myName { // nil이 아닐 경우
printName(name)
} else { // nil일 경우
print("myName == nil")
}
// 옵셔널 바인딩은 여러개도 가능. 모두 nil이 아닐 경우 동작
var myName: String? = nil
var yourName: String! = nil
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
옵셔널 체이닝 : 옵셔널을 연속으로 사용하는 것(메소드에 옵셔널이 하나라도 껴있으면)
ex) person.contact?.address
person?.contact?.address 등
강제 언래핑 "!" : nil이 아니라면 언래핑되지만 nil이면 런타임에러 발생
nil이 아님을 확신할 때 사용하며 지양하는 것이 좋음
var optionalInt: Int? = 10
let intValue = optionalInt! // ! => 강제추출
print("\(intValue)")
var optionalInt: Int?
let intValue = optionalInt! // 강제추출 했지만 nil이기 때문에 에러 발생
묵시적 언래핑 "!" : 옵셔널 타입 선언시 "?" 대신 "!"을 사용. 별도의 언래핑 없이 동작하며 강제 언래핑과 마찬가지로 런타임에러 주의
기본값 제공 : 옵셔널 값이 nil일 경우 ?? 뒤의 기본값을 제공
let name: String? = nil
print(name ?? "default name")