일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- convert base64
- swift
- List
- scrolling tab
- Swift Package Manager
- pod install
- 개발자 면접
- DataBinding
- url 관찰
- GeometryReader
- notifychanged
- SwiftUI
- 상단 탭바
- development language
- ViewBuilder
- 기존 앱
- detect url
- 스크롤 탭
- Android
- ios
- url 추적
- transformation.map
- oberve url
- UIViewControllerTransitioningDelegate
- DevelopmentRegion
- swift #swift keychain #keychain 사용법
- Side Menu
- UIPresentationController
- Tuist
- base64 변환
- Today
- Total
버그 잡이
Swift 옵셔널, 옵셔널 바인딩, 체이닝 본문
옵셔널(Optional)이란?
Optional : "선택적인" 이라는 뜻으로 값이 있을 수도 있고 없을 수도 있는 것 입니다.
정확히 말하면 빈 값(nil)이 될 수 있는 것이죠.
*Kotlin의 nullable과 비슷한 개념입니다.
기본적으로 swift는 변수에 nil을 넣을 수 없습니다.
kotlin에서도 nullable 타입이 아니면 null을 넣을 수 없는 것 처럼요.
이러한 특성 때문에 nil 값으로 인한 런타임 에러를 더욱 예방할 수 있습니다.
형태
타입 뒤에 "?" 를 붙여줍니다.
var name: String? print(name) //nil name = "ray" print(name) //Optional("ray")
var name: String? print(name) //nil name = "ray" print(name) //Optional("ray")
옵셔널 변수 ≠ 기본 변수
let optionalName: String? = "ray"
let basicName: String = optionalName //컴파일 에러가 납니다.
"왜 컴파일 에러가 날까요?"
basicName은 옵셔널이 아닌 String 이기 때문에 항상 값을 가지고 있어야 합니다.
optionalName은 옵셔널 변수인데, 옵셔널로 선언된 변수는 코드가 실행되기 전까지는 값이 있는지 없는지 알 수 없습니다.
그래서 swift 컴파일러는 안전을 위해 옵셔널로 선언된 변수를 기본 변수에 대입할 경우 컴파일 에러를 냅니다.
"그렇다면 옵셔널 변수를 사용하고 싶을 때는 어떻게 해야 할까요?"
옵셔널 바인딩
옵셔널의 값을 가져오고 싶은 경우 사용하는 방법이 바로 옵셔널 바인딩입니다.
옵셔널 바인딩은 옵셔널이 값이 존재하는지를 검사한 뒤, 값이 존재한다면 그 값을 다른 변수에 대입시켜 줍니다.
if let name = optionalName{
print(name) // "ray"
}
//optionalName == nil 일 경우 if문을 지나칩니다.
- 옵셔널 바인딩 응용
//두 개 이상의 옵셔널 바인딩
var optionalName: String? = "ray"
var optionalAge: Int? = 20
if let name = optionalName, age = optionalAge {
}
//동시에 조건문 처리도 가능
if let name = optionalName, age = optionalAge, age >= 10 {
}
옵셔널 체이닝
옵셔널 바인딩 코드를 좀 더 간결하게 만들어 줍니다.
코드로 살펴보겠습니다.
let array: [String]? = []
if let array = array, array.isEmpty{
}
//위 코드를 optional chaining을 통해서 줄여보겠습니다.
let isEmptyArray = array?.inEmpty{
}
위처럼 옵셔널 바인딩 과정을 ? 키워드로 줄여주는 역할을 합니다.
-
array가 nil인 경우
→ array? 까지 실행되고 'nil'을 반환합니다.
-
array가 빈 배열인 경우
→ array?.isEmpty 까지 실행되고 'false'를 반환합니다.
-
array에 요소가 있는 경우
→ array?.isEmpty 까지 실행되고 'true'를 반환합니다.
다음 예제 코드를 보면 왜 옵셔널 체이닝을 써야 하는지 알 수 있습니다.
// 옵셔널 체이닝을 사용하지 않는다면...
func guardJob(owner: Person?) {
if let owner = owner {
if let home = owner.home {
if let `guard` = home.guard {
if let guardJob = `guard`.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
}
}
}
guardJob(owner: yagom)
// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner: Person?) {
if let guardJob = owner?.home?.guard?.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
출처: https://yagom.github.io/swift_basic/contents/16_optional_chaining/
강제로 옵셔널 벗기기
개발자가 판단하기에 값이 있을 것이 확실한 옵셔널은 강제로 옵셔널을 벗길 수 있습니다.
print(optionalName) //Optional("ray") print(optionalName!) //"ray"
하지만 ! 를 붙여 강제로 벗겼지만 실제로는 nil 값이라면 런타임 에러가 발생합니다.
* 참고
https://devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-2/optionals.html
'Swift' 카테고리의 다른 글
Swift - Escaping Closure(탈출 클로저) 간단 이해 (0) | 2020.08.13 |
---|---|
Swift - protocol(프로토콜) (0) | 2020.08.09 |
Swift - 서브스크립트(subscript) (0) | 2020.08.03 |
Swift 이니셜라이져 init() (0) | 2020.07.30 |
Swift - collections type (Array, Dictionary, Set) (0) | 2020.07.27 |