스위프트 옵셔널 타입
스위프트 옵셔널 타입은 대부분의 프로그래밍 언어에 없는 개념이다.
옵셔널 타입의 목적은 변수 또는 상수에 값이 할당되지 않는 상황을 처리하기 위해 안전하고 일관된 접근 방식을 제공하기 위함이다.
변수를 선언할 때, 데이터 타입 선언 다음에 '?' 문자를 쓰면 옵셔널하게 된다.
var index: Int?
Int형의 옵셔널한 변수를 선언하게 되면 정숫값이 할당되거나 아무런 값도 할당되지 않을 수 있다. (정수 or nil)
컴파일러와 런타임의 관점에서 보면 어떤 값도 할당되지 않는 값을 nil로 갖는다.
옵셔널 타입을 쓰는 이유
1. 명시적 표현, nil(흔히 다른 프로그래밍 언어에서는 NULL로도 표현됨)의 가능성을 코드만으로도 명시적 표현 가능하다.
2. 안전한 사용, 전달 받은 값이 옵셔널 타입이 아니라면 nil 체크를 안해도 된다.
옵셔널은 할당된 값이 있는지 식별하기 위해 밑의 코드처럼 할 수 있다.
var index: Int?
if index != nil{
// index 값이 정수인 경우
}
else {
// index 값이 nil인 경우(할당되어 있지 않다)
}
* 만약 옵셔널에 값이 할당되었다면 해당 값을 "래핑되었다(wrapped)"고 말한다.
옵셔널 타입의 변수는 옵셔널이 아닌 변수와는 다르다. 예를 들어
let optionalIndex: Int? = 12
let index: Int = optionalIndex
// 컴파일 에러
Int?와 Int는 다르다. 그렇다면 어떻게 이 옵셔널 값을 사용할 수 있는가
옵셔널 값을 사용하는 방법
옵셔널 값을 사용하는 방법은 크게 3가지가 있다.
* 강제 언래핑(forced unwrapping)
* 옵셔널 바인딩(Optional Binding)
* 옵셔널 체이닝(Optional Chaining)
강제 언래핑(forced unwrapping)
강제 언래핑은 옵셔널 타입의 변수 뒤에 '!' 를 붙여주면 된다.
var optionalIndex: Int? = 13
print(optionalIndex! + 12)
// 25
위 코드와 같이 !를 붙여주면 값을 꺼내서(?) 사용할 수 있다.
옵셔널 바인딩(Optional Binding)
옵셔널 바인딩은 if-else문과 비슷하다.
if let constantName = optionalName {
}
if var variableName = optionalName {
}
이 코드는 두 가지 작업을 수행한다. 1. 지정된 옵셔널이 값을 갖고 있는지 확인하고 2. 옵셔널 변수가 값을 갖고 있는 경우 선언된 상수 or 변수에 옵셔널 값을 할당하고 if문의 코드가 실행된다.
옵셔널 체이닝(Optional Chaining)
옵셔널 체이닝은 체인처럼 연쇄적으로 옵셔널에 접근하는 방법이다.
옵셔널 체이닝을 활용하면 코드를 매우 간결하게 작성할 수 있다.
struct Contacts{
var email : String
var address : [String : String]
}
struct Student{
var name : String
var contacts : Contacts
init(name : String, email : String, address : String){
self.name = name
contacts = Contacts(email : email, address : ["home" : address])
}
}
var my : Student? = Student(name : "Woosk", email: "woodool23@naver.com", address: "suwon")
print(my?.contacts.email)
이렇게 구조체가 있다면 인스턴스에 ?를 붙여주어 옵셔널이라는 것을 알려주어 사용 할 수 있다.
이를 활용하여 옵셔널 바인딩과 옵셔널 체이닝을 응용 하면
if let my_email = my?.contacts.email{
print(my_email)
}
else {
print("nil")
}
위의 코드와 같이 my_email상수 값에 할당하면서 if문까지 간결하게 활용할 수 있다.
출처 : 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
책을 보면서 내용을 정리했습니다.. 혹시 틀린 내용이 있다면 댓글로 언제나 말씀해주세요!!!☺️
'iOS > Swift 문법' 카테고리의 다른 글
[Swift 문법] 제어 흐름, 반복문과 조건문 (0) | 2021.12.24 |
---|---|
[Swift 문법] 연산자와 표현식 (0) | 2021.12.23 |
[Swift 문법] 타입 캐스팅과 타입 검사 (0) | 2021.12.22 |
[Swift 문법] 타입 선언과 타입 추론, 튜플 (0) | 2021.12.21 |
[Swift 문법] 데이터 타입, 상수, 변수 (0) | 2021.12.20 |