- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 연산자
- MVC
- 티스토리챌린지
- SWIFT
- SQL
- 명령어
- Request
- decode
- deeplearning
- sigmoid
- swiftUI
- Observable
- 딥러닝
- Python
- rxswift
- 시각화
- scheduledTimer
- HTTP
- ios
- r
- struct
- Linux
- cocoapods
- rest api
- substr
- barplot
- Optional
- ReLU
- 오블완
- tapply
iOS 개발 기록 블로그
iOS(Swift) Optional 완벽 이해 (5단계) 본문
Optional을 이해하기 위한 5가지 단계
- Force Unwrapping
- Check for nil value
- Optional Binding
- Nil Coalsecing Operator
- Optional Chaining
OptionalsDemo라는새로운 프로젝트 생성
let myOptional: String? myOptional = "CrazyDeer" let text: String = myOptional |
위와 같은 코드에서 세번째 줄이 에러가 나온다.
text 변수는 String이지만
myOptional이라는 데이터 타입이 String?이기 때문이다.
이 Optional 데이터를 사용하기 위한 방법 5가지인 것이다.
간단한 방법이 이것이다.
Force Unwrapping
변수 뒤에 ! 느낌표를 붙여주는 방법
그런데 이때 myOptional 데이터를 nil 값을 줘본다.
Xcode 상에서는 에러가 나지 않지만
실행해보면 충돌이 일어난다.
이를 '런타임 에러' 라고 한다.
콘솔 창의 에러 메시지
Check for nil value
이런 런타임 에러가 나지 않게 하기 위한
안전장치로값인지 체크하는 방법이 있다.
let myOptional: String? myOptional = nil if myOptional != nil { let text: String= myOptional! } else{ print("myOptional was found to be nil.") } |
myOptional이 nil이 아닌지 체크
위 코드는 당연히도 else 조건에서 쓰인 문자열이 출력된다.
그런데 여기서 문제가 있다.
이 장황하고 불필요해보이는 조건문을 항상 써줘야만 하고
여전히 코드 내에서 사용하기 위해서 !를 붙여줘서
강제 언래핑을 해줘야 한다.
Optional Binding
새로운 상수(constant)를 생성해서 조건문 안에서
myOptional과 = 연산자로 대입한다.
이러면 safeOptional이 nil 값이 아닌지 체크하면서
바로 일반 String으로 쓸 수 있다.
Nil Coalescing Operator
?? 연산자로 더 간결하게 사용할 수 있다.
해당 Optional이 nil이면 default value로 쓰도록 하는 것이다.
text에 Optional 데이터를 대입하는데
nil coalescing operator (??)를를 사용하여
nil인 경우 다음과 같은 값을 text에 대입하는 방법이다.
그러면 Optional 데이터를 가진
Struct나 Class에서는 어떻게 사용할까?
struct MyOptional { var propertySample = 12345 func methodSample() { print("This is a Struct's method.") } } let myOptional: MyOptional? // struct's optional myOptional = MyOptional() //myOptional = nil print(myOptional!.propertySample) |
위와 같은 코드처럼 기본 구조체가 있고
let myOptional에서에서 그 구조체를 Optional로 받아왔다.
마지막 줄처럼 force unwrapping 해주면 사용이 가능하지만
위에서 설명했던 것처럼
myOptional = nil 이 들어가면 런타임 에러가 난다.
그럼 위 코드를 더 안전하게 하기 위한 방법은 뭐가 있을까?
Optional Chaining
optional?.property optional?.method |
위와 같이 ? 를 붙여서 프로퍼티와 메소드를 부르는 것이다.
그러면 각 프로퍼티와 메소드 또는 구조체가 nil이
아닐 경우에 가져오게 된다.
code
struct MyOptional { var propertySample = 12345 func methodSample() { print("This is a Struct's method.") } } let myOptional: MyOptional? // struct's optional myOptional = MyOptional() //myOptional = nil print(myOptional?.propertySample) myOptional?.methodSample() |
result (Console)
정리
Force Unwrapping | optional! |
Check for nil value | if optional != nil { optional! } |
Optional Binding | if let safeOptional = optional { safeOptional } |
Nil Coalescing Operator | optional ?? defaultValue |
Optional Chaining | optional?.property optional?.method() |
참고
안젤라유 강의: https://www.udemy.com/course/ios-13-app-development-bootcamp/
'iOS' 카테고리의 다른 글
iOS(Swift) Dark Mode 적용 및 Custom Set (0) | 2022.06.09 |
---|---|
iOS(Swift) SF Symbols 설치 및 이미지 사용 (0) | 2022.06.08 |
iOS(Swift) Struct와 Class의 차이 (0) | 2022.05.26 |
iOS(Swift) Class의 모든 것 (SuperClass, SubClass, Inheritance, Override) (0) | 2022.05.25 |
iOS(Swift) UI Slider 사용 방법 (0) | 2022.05.24 |