티스토리 뷰

Swift

[iOS] Swift Optional(Optional Binding)

dev-Jun 2021. 2. 10. 12:13

Swift를 처음 배우는 사람들에게는 조금 생소한 개념인 Optional에 대해서 알아보겠습니다


Optional ?

- 타입에 값이 있을 수도, 없을 수도 있음을 표현한 것입니다.

- 값이 없음은 nil로 표현할 수 있습니다.

- 즉, nil이 할당될 수 있는지 없는지를 표현하는 것입니다.

- Optional 타입이 아닌 경우에는 nil 값을 갖게 되면 오류가 발생합니다.

- 예를 들면, 사람들에게는 소유하고 있는 집이 있을 수 있고, 없을 수도 있습니다.

이런 특징을 가진 변수/상수에 Optional 타입을 할당합니다.

var houseName : String? => 다음과 같이 타입 뒤에 ? 를 붙임으로써 Optional 형식으로 타입을 선언합니다.

- Optional 타입일 때 nil이 아닌 값을 print 하면 Optional(값)의 형태로 출력됩니다.

var houseName: String = nil (x)
var houseName: String? = nil (o)

houseName = "apart"

print(houseName)
//Optional("apart")

 

왜 사용할까?

- 예외상황을 최소화하는 안전한 코딩을 위해서 사용합니다

 

 

문제점

- Optional 타입의 값을 사용할 때 그대로 사용할 수 없습니다.

- 위의 예와 같이 Optional("apart") 형태로 저장이 되어있어서 이 값을 추출해서 사용해야 합니다.

- 값을 추출하기 위해서 3가지 방법이 있습니다.

 


1. Forced unwrapping (!)

- Optional에 값이 들어있는지 아닌지 확인하지 않고 강제로 값을 꺼내는 방식입니다.

- 값이 있다면 바로 출력되지만, 값이 없다면(nil) 에러가 발생합니다.

- !를 붙여서 사용합니다.

- 에러를 발생시키기 때문에 많이 추천되는 방법은 아닙니다.

var houseName: String? = "apart"
print(houseName!) //apart

houseName = nil
print(houseName!) //Error

 

2. Optional Binding (If let ~)

- Optional 안에 값이 들어있는지 확인하고 값이 있으면 값을 꺼내옵니다.

- 값이 있다면 if let 문의 내용이 실행되고, 값이 없다면 else 문의 내용이 실행됩니다.

- if let 값을 받을 상수 이름 = Optional 값 { ... } else { ... }

- else 문이 없고, 값이 nil이라면 아무것도 실행되지 않고 뒤의 코드로 진행됩니다.

var houseName: String? = "apart"
if let house = houseName {
    print(house) //apart 출력
} else {
    print("nohome") //houseName이 nil일 때 출력
}

 

3. Optional Binding (guard let ~)

- If let 과 같이, Optional 안에 값이 들어있는지 확인하고 값이 있으면 값을 꺼내옵니다.

- 값이 있다면 뒤의 코드로 이어지고 값이 없다면 else에서 처리됩니다.

- else 문에선 return, break 같은 코드 블록을 종료시키는 명령어가 필요합니다.

- guard let 값을 받을 상수 이름 = Optional 값 else { ... return} ...

- 보통 함수 안에서 사용합니다.

func ob() {
    let houseName: String? = "apart"
    
    guard let house = houseName else {
        print("nohouse") // houseName이 nil일 때 출력
        return
    }
    print(house) // apart 출력
}

ob()

 

Reference :

네이버 부스트 코스 > iOS 앱 프로그래밍

패스트캠퍼스 iOS 앱 개발 올인원 패키지

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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 31
글 보관함