Swift 옵셔널
var name: String? = "rarla"
// 정식문법
// var name: Option<String> = "rarla"
print(name) // Optional("rarla")
- Swift에 옵셔널은 타입이 지정되어있는 특정 변수에 값이 할당되지 않은 경우 발생하는 에러를 막기 위해 임시적인 타입인 nil을 담아두는 것을 의미
- 옵셔널 타입은 옵셔널이 아닌 타입과 완전히 다른 타입
- 옵셔널 타입에는 해당 변수에 nil을 할당할 수 있지만, 옵셔널이 아닌 타입에는 nil을 할당할 수 없음
- 옵셔녈 타입은 변수로 선언해야 의미가 있음. 상수인 경우에는 값을 재할당할 수 없기 때문
- 옵셔널 타입의 변수는 print 해보면 Optional이라는 포장지에 감싼 형태로 출력이 되어 사용할때는 벗겨주는 작업이 필요
- Stirng? = String + nil // 옵셔널 타입이 더 큰 개념
- String? 타입에 String을 할당하더라도 String? 타입은 변하지 않음
- 옵셔널 타입끼리는 연산이 불가능
- 자바스크립트에 있는 옵셔널 체이닝 연산자(?.)와 유사
- 자바스크립트의 옵셔널 체이닝 연산자 : 참조가 nullish라면 에러가 발생하는 것 대신 표현식의 리턴값이 undefined로 일단락됨
옵셔널 타입 추출
1. 강제 추출 (Force Unwrapping) : 값이 있음을 확신할 때 사용
print(name!) // "rarla"
2. if문으로 nil이 아님을 확인 후 강제 추출
if name != nil {
print(name!)
}
3. 옵셔널 바인딩 (if let 바인딩) <- 주로 사용
if let n = name {
print(n) // n의 Type은 String
}
- 유사하게 guard let 바인딩도 많이 사용
func sampleFunc(name: String?) {
guard let n = name else { return }
print(n)
}
4. 닐 코얼레싱(Nil-Coalescing) 연산자 사용 : 기본값을 제시할 수 있을 때 사용
let userName = name ?? "닉네임 없음"
- 자바스크립트는 삼항연산자를 사용하는 부분과 유사함 `name ? name : "-"`
- Swift도 삼항연산자를 사용할 수 있지만 닐 코얼레싱 방법이 더 간편하기 때문에 굳이 사용하지 않음
옵셔널 체이닝
- 자바스크립트에 있는 옵셔널 체이닝 연산자(?.)과 동일
- 자바스크립트의 옵셔널 체이닝 연산자 : 참조가 nullish라면 에러가 발생하는 것 대신 표현식의 리턴값이 undefined로 일단락됨
// 함수 관련 표기법
choco?.sit?()?.name
// sit? -> sit이라는 함수가 없을 수 있다
// sit?()? -> sit 함수 실행 결과값이 없을 수 있다
// 딕셔너리 관련 표기법
books?["Apple"]?.name
// books? -> 딕셔너리 자체가 없을 수 있다
// books?["Apple"]? -> 딕셔너리 결과값이 없을 수 있다
// 함수의 실행
bori?.sit()
// 리턴값이 있고 nil이 아니면 옵셔널 리턴값 반환
// 리턴값이 없고 nil이 아니면 함수 실행
// nil이면 nil 반환
옵셔널 더 정확히 이해하기
enum Optional<Wrapped> {
case some(Wrapped)
case none
}
- 옵셔널 타입의 내부는 열거형, 열거형의 연관값으로 값이 저장되는 것
728x90
'FRONT-END > iOS' 카테고리의 다른 글
자바스크립트와 비교하며 Swift 공부하기 - Dictionary편 (0) | 2023.07.08 |
---|---|
자바스크립트와 비교하며 Swift 공부하기 - 컬렉션, Array편 (0) | 2023.07.08 |
자바스크립트와 비교하며 Swift 공부하기 - 함수편 (0) | 2023.07.07 |
자바스크립트와 비교하며 Swift 공부하기 - 어트리뷰트 키워드편 (0) | 2023.07.07 |
자바스크립트와 비교하며 Swift 공부하기 - 반복문편 (+print option) (0) | 2023.07.05 |
댓글