swift 5 문법
[swift] 5. 옵셔널(Optional)
jake-kim
2020. 3. 26. 14:30
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)
|