Optional
Optional은 nil을 사용할 수 있는 타입과 없는 타입을 구분하기 위해 사용하며
nil을 사용할 수 있는 Type을 Optional Type이라 부른다.
let optional: String? = nil // 옵셔널 타입
let nonOptional: String = "Test" // 넌 옵셔널 타입
Optional 타입을 사용하기 위해서는 타입 뒤에 ? 를 붙여 사용하며
만약 Non-Optional 타입에 nil을 할당하게되면 에러가 발생하므로 주의해야한다.
let nonOptional: String = nil // 에러
Optional 변수에 초기값을 지정해주지 않으면 기본값은 nil이다.
let optional: String? // nil
Optional타입 변수를 Non-Optional타입 변수에 대입하도록 했을 경우에도 에러가 발생한다.
let optionalStr: String? = "ABCDE"
let engStr: String = optionalStr // 에러 발생
Optional 타입의 값을 프린트문으로 출력해보면 Optional()로 감싸져 있다.
let optionalStr: String? = "Test"
print(optionalStr) // Optional("Test")
이때 Optional()로 감싸져 있는 속알맹이 값을 꺼내는 행위를 Unwrapping이라고 한다.
강제추출(Forced Unwrapping)
강제로 옵셔널로 랩핑되어 있는 값을 추출하는 방법으로 옵셔널 값 뒤에 ! 를 붙인다.
강제 추출을 사용할 때 옵셔널 값이 있을 경우에는 문제가 없지만, 만약 값이 없는 경우에는 에러가 발생한다.
var forcedUnwrapping: String? = "Test"
print(forcedUnwrapping) // Optional("Test")
print(forcedUnwrapping!) // Test
forcedUnwrapping = nil
print(forcedUnwrapping!) // Error!!
위 결과에서 보이듯이 값이 확실히 있다고 보장되는 경우에만 사용하는것이 좋다.
옵셔널 바인딩(Optional Binding)
옵셔널을 안전하게 처리하는 방법으로 if문과 guard문을 사용하여 옵셔널 값을 추출한다.
if let
var optionalStr1: String? = "Test"
if let unwrapping = optionalStr1 {
print("옵셔널 바인딩 성공", unwrapping)
} else {
print("옵셔널 바인딩 실패")
}
if let은 옵셔널 바인딩에 성공한 경우 unwrapping 상수를 if문 내부에서만 사용 가능하다.
guard let
var optionalStr2: String? = "Test"
func optionalFunc(_ name: String?) {
guard let unwrapping = name else { return }
print(unwrapping) // Test
}
guard let에서는 옵셔널 바인딩에 성공한 경우 unwrapping2 상수를 함수 내부의 지역 상수처럼 사용 가능하다.
Nil-Coalescing Operator
?? 를 사용하여 옵셔널 값이 있는 경우에는 옵셔널을 벗긴 값을 반환하고 값이 nil인 경우에는 지정한 값을 반횐하도록 한다.
아래 코드는 Nil-Coalescing Operator를 사용하지 않고 언랩핑하는 코드이다.
var optionalStr: String? = "Test"
if let unwrapping = optionalStr {
print(unwrapping)
} else {
print("언랩핑 실패")
}
위 코드를 Nil-Coalescing Operator를 사용하여 언랩핑 하게되면 아래 코드처럼 작성 가능하다.
let unwrapping = optionalStr ?? ""
print(unwrapping)
'Swift > Swift문법' 카테고리의 다른 글
| Swift문법 - Closure (0) | 2023.01.28 |
|---|---|
| Swift문법 - Functions (0) | 2023.01.22 |
| Swift문법 - Control Transfer Statements, Labeled Statements (0) | 2023.01.08 |
| Swift문법 - Loop Statements (0) | 2022.12.23 |
| Swift문법 - Conditional Statements(if, switch, guard) (0) | 2022.12.10 |