티스토리 뷰
변수는 때로는 값을 갖고있지 않을 때도 있습니다.
Optional은 변수의 값이 없을(=변수의 값이 nil 일) 가능성이 있다는 것을 암시하는 장치입니다.
변수명 뒤에 ?를 붙여서 옵셔널 타입 변수임을 명시할 수 있고, 옵셔널 타입 변수가 아니면 nil이 될 수 없습니다.
Optional이 붙지 않은 변수에 nil을 대입하려고 시도하면 에러가 나타나며 프로그램이 동작하지 않습니다.
이를 통해 정상적이지 않은 코드가 생성되지 않도록 방지할 수 있습니다.
var A : Int? = 1
var B = A
//A와 B는 nil일 수도 있으며, 값 1을 가지고 있습니다.
var C : Int? = 2
var D : Int = C // 오류
//C는 nil일 수도 있으며, 값 2을 가지고 있습니다.
//D는 자료형이 Int로 고정되어있기 때문에 자료형이 Int?인 C와 같을 수 없습니다.
var E : Int? = 3
var F : Int = E! //F=3
//E는 nil일 수도 있으며, 값 3을 가지고 있습니다.
//F는 자료형이 Int로 고정되어있지만 E!를 통해 강제로 E가 가진 값 3을 가져올 수 있습니다.
자료형 뒤에 ?가 붙으면 nil이 할당될 수 있으며 변수의 값이 nil이라도 메모리를 차지하게 됩니다.
옵셔널 타입 변수의 값을 옵셔널 타입이 아닌 변수가 갖기 위해 !를 붙여 뽑아올 수 있습니다.
옵셔널 타입의 변수가 가진 값을 강제로 추출하는 것을 Force Unwrapping이라고 합니다.
Force Unwrapping
var G : Int? = nil
var H : Int = G! //오류
//G의 값은 nil일 수도 있고, 실제로 nil을 가지고 있습니다.
//H는 G의 값을 가져오기 위해 !을 사용했으나 값을 가져올 수 없습니다.
단, 이 방법은 해당 변수가 nil이 아님을 확신할 수 있는 경우가 아니라면 사용해서는 안됩니다.
따라서 변수의 값을 안전하게 가져오기 위해 다른 방법이 권장됩니다.
Optional Binding
var A: Int? = nil
if let B = A {
print(B)
}
//출력이 안됨
var C: Int? = 2
if let D = C {
print(D)
}
//2가 출력됨
Force Unwrapping의 위험성을 피하기 위해 미리 if로 체크해주는 것을 Optional Binding라고 합니다.
옵셔널의 값이 존재한다면 그 값을 변수에 넣어주지만 값이 없다면 if문이 실행되지 않습니다.
Optional Chaining
array?.isEmpty
스위프트는 코드의 간결성을 위해 옵셔널을 이용한 Optional Chaining이라는 방법이 존재합니다.
array가 nil일 경우 ? 까지만 실행이 되고 nil이 반환됩니다.
array가 [ ]일 경우 (=nil은 아닌 상태) isEmpty까지 실행되고 true를 반환합니다.
array가 [ ... ]일 경우 (=nil은 아닌 상태) isEmpty까지 실행되고 false를 반환합니다.
암시적 추출 옵셔널(Implicitly Unwrapped Optionals)
var name: String! = "levenshtein"
print(name) // levenshtein
name = nil
if var hani = name {
print(hani)
} else {
print("nil")
}
암시적 추출 옵셔널은 자료형에 ! 를 붙여 nil이 아님을 명시할 수 있습니다.
nil은 될 수 없지만 호출되지만 않으면 nil을 잠깐 가지고 있을 수 있습니다.
nil이 아닌 경우에만 접근 가능하며 nil일 경우 에러가 발생합니다.
암시적 추출 옵셔널도 일단 옵셔널이긴 하기 때문에 옵셔널 바인딩을 통해 에러가 발생하는 것을 막을 수 있습니다.
'Swift' 카테고리의 다른 글
[Swift] 인스턴스 (0) | 2021.01.16 |
---|---|
[Swift] 프로퍼티의 종류 (0) | 2021.01.13 |
[Swift] 메서드 (0) | 2021.01.13 |
[Swift] 클래스와 구조체 (0) | 2021.01.10 |
[Swift] 객체 지향 프로그래밍 (0) | 2021.01.09 |
- Total
- Today
- Yesterday
- State Restoration
- WWDC16
- WWDC19
- 네트워크 유량
- WWDC21
- 최단경로 알고리즘
- mach-o
- 다익스트라 시간복잡도
- CPU와 Memory
- 최단경로문제
- 에드몬드 카프 알고리즘
- CompositionalLayout
- 포드 풀커슨 알고리즘
- MeTal
- observeOn
- 최대 매칭
- 컴퓨터 추상화
- WWDC17
- test coverage
- 강한 순환 참조
- 벨만포드 알고리즘
- 최단경로 문제
- 코딩대회
- rxswift
- 벨만포드 시간복잡도
- IOS
- 부스트캠프 6기
- HIG
- Testable
- 네트워크 플로우
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |