옵셔널이란?
옵셔널이란 nil을 사용할 수 있는 Type을 옵셔널 타입이라고 부르며, nil을 가질 수 있는 값은 옵셔널 타입이다.
옵셔널 체이닝(Optional Chaining)
class Person {
var residence: Residence?
}
if let roomCount = john.residence?.numberOfRooms {
print("John's residence has \(roomCount) room(s).")
} else {
print("Unable to retrieve the number of rooms.")
}
// Prints "Unable to retrieve the number of rooms."
강제 언래핑(Forced Wrapping)
var name: String? = "jiSeok"
if name != nil {
print("name = \(name!)")
} else {
print("name = nil")
}
- 변수명 뒤에 느낌표를 붙혀서 강제 언래핑이 가능하다.
- 실제 프로그래밍에서는 거의 사용할 일 없다. --> 강제 언래핑을 사용하는 것이 위험하기 때문. 그래서 사용하는 방법이 옵셔널 바인딩 !
옵셔널 바인딩(Optional Binding)
- 안전하게 옵셔널 값을 언래핑 하는 방법
if let
if let actualNumber = Int(possibleNumber) {
print(“The string “(possibleNumber)” has an integer value of (actualNumber)”)
} else {
print("The string \"\(possibleNumber)\" couldn't be converted to an integer")
} // Prints “The string “123” has an integer value of 123”
- 위에서 if문 밖에서는 actualNumber라는 상수에 접근할 수 없다.
guard let
- guard let은 특성상 함수(메소드)에서만 쓰임
- guard 구문의 조건을 만족하지 못하면 함수를 종료 시킬 때 사용
let optinalNum: Int? = nil
guard let nonOptionalNum = optinalNum else {
return // optionalNum이 nil일 경우.
}
// optionalNum이 nil이 아닐 경우.
- else문 내부에서는 nonOptionalNum을 사용할 수 없음
if let을 사용하는 경우
- 단순한 옵셔널 처리 값에 대한 피드백에 사용
- 값이 있으면 if문으로 처리하고 없을 경우 else 문으로 처리
gurad let을 사용하는 경우
- 옵셔널 처리 값이 nil인 경우 함수가 실행되지 않도록 하는 경우
- 값이 없으면 함수 종료 !
암시적으로 언래핑된 옵셔널(Implicitly Unwrapped Optionals)
let possibleString: String? = “An optional string.”
let forcedString: String = possibleString! // 느낌표가 필요하고…(강제 언래핑)
let assumedString: String! = “An implicitly unwrapped optional string.”
let implicitString: String = assumedString // no need for an exclamation point // 느낌표가 필요없고…
- IUO도 옵셔널 타입
- 웬만해서 사용하지 말라고 한다 . .
?? 연산자 (Nil-Coalescing Operation)
let name: String?
print("hello, " + (name ?? "익명님"))
- name이 nil이기에 ?? 이후의 익명님이 출력
옵셔널 체이닝(Optional Chaining)
- 내부 프로퍼티 or 메소드에 연속적으로 접근할 때 옵셔널 값이 하나라도 껴 있으면 옵셔널 체이닝
ex : person?.contacts?.address
특징
- 옵셔널 체이닝의 결과값의 타입은 마지막 표현식의 옵셔널 타입
- 옵셔널 체이닝의 마지막 표현식은 옵셔널이더라도 ?를 생략
- 옵셔널 체이닝의 표현식 중 하나라도 nil이라면, 이어지는 표현식은 상관하지 않고 nil을 리턴
참고 자료
'iOS & Swift' 카테고리의 다른 글
[Swift] 타입 캐스팅이란 ? (is, as) (0) | 2022.05.11 |
---|---|
[iOS] swift Alamofire 토큰 재발급 구현 방법(adapt, retry, RequestIntercepter) (0) | 2022.04.25 |
[Swift] Swift 공식문서 정리 - 4(열거형) (0) | 2022.04.06 |
[Swift] Swift 공식문서 정리 - 3(클래스 & 구조체) (0) | 2022.04.04 |
[Swift] Swift 공식문서 정리 - 2(제어문, 함수) (0) | 2022.03.29 |