Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- uitableview
- UITextView
- SWIFT
- combine
- map
- uiscrollview
- ios
- Protocol
- 스위프트
- 리팩토링
- rxswift
- 클린 코드
- collectionview
- 리펙터링
- clean architecture
- 리펙토링
- 애니메이션
- Human interface guide
- swift documentation
- Refactoring
- UICollectionView
- Observable
- tableView
- RxCocoa
- Xcode
- MVVM
- Clean Code
- swiftUI
- HIG
- ribs
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[swift] 5. 옵셔널(Optional) 본문
1. Optional 타입이란?
- '?'로 표현
- nil(값이 없음) 타입을 정의하기 위한 수단
1
|
var myValue : Int = nil // error : 'nil' cannot initialize specified type 'Int'
|
nil타입을 사용하기 위해서는 optional형태로 감싼 자료형으로 표현가능
Optional(nil), Optional(123)
1
2
3
4
|
var myValue : Int? = nil
var optDic : [String:String]? // Dictionary 타입
Int("123") // 옵셔널 객체로 반환
Int("123") + 123 // error : 옵셔널 객체는 연산 불가
|
- 자료형 뒤에 '?' 붙이는 것
- 연산이 불가능 함
2. 옵셔널 해제
1) 옵셔널 강제 해제 '!'
1
2
3
|
var myValue : Int? = 123
print(myValue) // Optional(123)
print(myValue!) // 123
|
- 값이 nil값이 아님을 확신하는 상태에서 사용함 (값이 nil이면 런타임 오류)
1
2
3
4
5
6
7
8
|
var myValue : Int = nil
print(myValue!) // error
if myValue != nil {
print(myValue!)
} else {
return
}
|
※ 선언시의 옵셔널 !와 ?비교
- 주의할 점은 둘 다 nil을 대입할 수 있지만 "런타임 에러가 발생하는 시점"에서의 차이가 있는 것
class A {
func abc() -> (){
print("abc")
}
}
var a: A! = A()
var b: A? = A()
a = nil // 오류 나지 않음
b = nil // 오류 나지 않음
print("a.abc = \(a.abc())") // 오류
print("b?.abc = \(b?.abc())") // 오류나지 않음
2) 옵셔널 바인딩
- if, guard문에서 상수로 선언된 변수에 Optional타입을 넣으면 자동으로 옵셔널이 해제됨
3) 비교 연산에서의 옵셔널 해제
- 비교 대상자 중 하나가 옵셔널이 아닌 타입이면, 모두 옵셔널 해제됨
1
2
3
4
5
6
7
|
var str = "123"
var v: Int = 10
if(str == v){
print("equal")
} else {
print("non equal")
}
|
3. 옵셔널 체인
1) 옵셔널 체인이 필요한 이유
- 옵셔널 타입으로 선언된 변수에 옵셔널 바인딩으로 접근한 경우
1
2
3
4
5
6
7
|
- 옵셔널 체인을 사용한 경우 : 최종 변수에는 '?'안붙여도 됨 ( 마지막 전 변수인 ceo가 있으면 name도 존재할 것이기 때문)
1
2
|
print(startup?.ceo?.name)
|
이 때 startup이나 ceo값 중 하나이상이 nil이면, 오류나지 않고 그냥 패스
- 옵셔널 강제 해제를 사용한 경우
1
|
print(startup!.ceo!.name)
|
'swift 5 문법' 카테고리의 다른 글
[swift] 7. 클로저(closure) (0) | 2020.03.26 |
---|---|
[swift] 6. 함수(일급 함수) (0) | 2020.03.26 |
[swift] 4. 배열(Array), 집합(Set), 튜플(Tuple), 딕셔너리(Dictionary) (0) | 2020.03.25 |
[swift] 3. 반복문 및 제어문 (0) | 2020.03.25 |
[swift] 2. 변수 및 연산자 (0) | 2020.03.25 |
Comments