옵셔널
- Swift는 기본적으로 nil(값없음)을 허용하지 않지만 개발을 하다보면 값이 없는 경우가 생김.
- 이것을 방지하기 위해 사용할 수 있는 것이 Optional.
- Optional을 사용하면 값이 없는 상황을 개발할 수 있음.
struct Person {
var name: String
var age: Int
var car: String? // ? 를 붙여서 옵셔널 타입이라고 명시(값이 없을 수도 있다!)
func introduce() {
print("내 이름은 \(name)이고 나이는 \(age)살임.")
}
}
- 기존 타입 뒤에 ? 키워드를 사용하여 옵셔널 타입으로 선언할 수 있음.
- 기본타입(Int, String, Float ... )
- Collection Type (Array, Dictionary, Set ... )
- Custom Type (struct, enum, class)
- 익명함수인 클로저
- 값을 할당할 때는 기존의 타입과 동일한 방식으로 사용하면 됨.
- 옵셔널 타입의 값에 접근하면 Optional로 감싸진 값이 나옴.(Optional로 래핑된 값이라고 부름)
옵셔널 타입으로 선언하기
// 기본 타입
var intValue: Int?
var stringValue: String?
//Collection Type
var array: [String]?
var dictionary: [String:String]?
//Custom Type
struct Person {
let name: String
}
var optionalPerson: Person?
//클로저
var closure: (() -> Void)?
옵셔널 타입을 사용하는 방법(할당과 접근)
//값을 할당할 때는 기존의 타입과 동일하게 사용하면 됨.
var intValue: Int? = 1
var stringValue: String?
stringValue = "HI!"
var nilValue: String? = nil
struct Person {
let name: String
}
var optionalPerson: Person? = Person(name: "Aiden")
var closure: (() -> Void)? = {
print("fire")
}
print("하이, \(intValue)") // 하이, Optional(1)
print(stringValue) // Optional("HI!")
print(nilValue) // nil
- Optional 타입과 기본타입은 다른 타입이기 때문에 연산이 불가능.
- 옵셔널 값에서 값만 추출하는 언래핑 작업을 통해 기본타입으로 변환하여 사용해야함.
- 단, 비교 연산자는 사용 가능.
var intValue: Int? = 1
var intValue2: Int = 2
if intValue == intValue2 {
print("같음")
} else {
print("다름")
}
옵셔널 체이닝(Optional Chaining)
- 옵셔널 체이닝은 옵셔널 타입을 포함하는 복잡한 데이터 구조에서 옵셔널 값이 nil인지를 간결하게 체크하고 접근할 수 있는 방법.
struct Person {
var name: String = "default name"
var animal: Animal?
}
struct Animal {
let name: String
var age: Int?
}
let person: Person? = Person(name: "Aiden", animal: nil)
print(person?.animal?.name) // nil
let person2 = Person(name: "Aiden", animal: Animal(name: "Dog", age: 5))
print(person2.animal?.age) // Optional(5)
// person2 는 Person타입이며, animal 프로퍼티는 Animal? 타입. 그러므로 옵셔널 래핑되어 출력.
let stringValue: String? = "안녕하세요"
print(stringValue?.count) // Optional(5)
- 중첩된 값 중 하나라도 nil이면 전체값을 nil로 반환함.
- 중첩된 값이 모두 nil이 아니면 Optional로 래핑된 값을 반환함.