관리 메뉴

김종권의 iOS 앱 개발 알아가기

[swift] 5. 옵셔널(Optional) 본문

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타입을 넣으면 자동으로 옵셔널이 해제됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        class A {
            func abc() -> (){
                print("abc")
            }
        }
        
        var a: A? = A()
 
        if let aa = a {
            print(aa.abc()) // "abc" 옵셔널 해제됨
        }
        
        guard let aa = a else {return}
        print(aa.abc()) // "abc" 옵셔널 해제됨
 

 

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
if let company = startup {
    if let ceo = company.ceo {
        if let name = ceo.name{
            print(name)
        }
    }
}
 

 

 - 옵셔널 체인을 사용한 경우 : 최종 변수에는 '?'안붙여도 됨 ( 마지막 전 변수인 ceo가 있으면 name도 존재할 것이기 때문)

1
2
print(startup?.ceo?.name)
 
 

 이 때 startup이나 ceo값 중 하나이상이 nil이면, 오류나지 않고 그냥 패스

 

 - 옵셔널 강제 해제를 사용한 경우

1
print(startup!.ceo!.name)
 

 

Comments