iOS

[iOS/Swift] 3. 옵셔널, 옵셔널 바인딩

AHHYE 2021. 2. 8. 09:19

 

 옵셔널 

: 어떤 값을 가질 수도 있고 값을 가지지 않을 수도(nil) 있는 변수

* 물음표( ? )를 사용하여 표시

var name: String = "Ahhye"
name = nil //컴파일 에러

var phone: String?
var email: String? = nil
print(phone) //nil
print(email) //nil

phone = "01012345678"
print(phone) //Optional(01012345678)

* 옵셔널이 아닌 변수에 옵셔널 변수 대입 불가능

 

 

 옵셔널 바인딩(Optional Binding) 

: 옵셔널 값이 존재하는지 확인 후 존재한다면 다른 변수에 그 값을 대입시키는 것

* if let/var 사용

* 여러 옵셔널을 바인딩할 때는 쉼표( , )로 구분하며 모든 옵셔널의 값이 존재해야 if문 실행

var optionalPhone: String? //nil

if let phone = optionalPhone {
    print(phone) //optionalPhone의 값이 nil이므로 실행하지 않음
}

var optionalEmail: String? = "abc123@aaaa.com"

if let email = optionalEmail {
    print(email) //Optional(abc123@aaaa.com)
}

var optionalGender: String? = "Female"
var optionalName: String? = "Ahhye"

if let gender = optionalGender, 
   name = optionalName {
    //모든 옵셔널의 값이 존재하므로 if문 실행
}

* 바인딩된 값의 조건을 정의할 때는 쉼표( , ) 사용

var optionalBrithyear: Int? = 1998

if let birthyear = optionalBirthyear, birthyear < 2002 {
//옵셔널 값이 존재하고 조건에 해당되므로 if문 실행
}

if let birthyear = optionalBirthyear {
    if age < 2002 {
    //이렇게도 쓸 수 있음
    }
}

 

 

 

 Unwrapping 

 

 Forced Upwrapping 

* 느낌표( ! ) 사용

* 옵셔널 값이 nil인 경우 런타임 에러 발생

print(optionalBirthyear) //Optional("1998")
print(optionalBirthyear!) //1998

 

 Implicitly Upwrapped Optional 

* 옵셔널 정의 시 물음표( ? ) 대신 느낌표( ! )를 붙이는 경우

* 바인딩이나 upwrapping 없이 값에 바로 접근 가능

var name: String! = "ahhye"
print(name) //ahhye

var name: String! //nil
print(name) //런타임 에러

 

 

 

 옵셔널 체이닝(Optional Chaining) 

* 인스턴스 내부의 옵셔널일 수 있는 값이 nil인지 확인할 수 있는 방법

* 옵셔널 바인딩 과정을 물음표( ? )로 줄여줌