Big Idea (큰 주제)
: 옵셔널
Essential Question (핵심 질문)
: 가지고 있는 데이터 따라 옵션적으로 값을 보여주거나, 보여주지 않거나 하려면 어떻게 해야할까?
Challenge (도전 과제)
: 알아보고, 직접 구현 해보고, 정리해보자
Activities (학습 활동)
:
현재 하고 있는 챌린지에서
이렇게 데이터를 표현해야한다.
1. 값이 무조건 있어야한다. (이게 기본, Non-Optional 타입)
2. 값이 있을 수도, 없을 수도 있다.
3. 값이 없으면 보여주지 않아야한다.
4. 값이 어떤가에 따라 다르게 처리해야한다.
이러한 조건에서 어떻게 앱을 구현해야할지 찾아봐야겠다.
일단 데이터에 값이 있을 수도 있고, 없을 수도 있음을 표현하는 방법은 여러가지가 있다.
프로그래밍 적으로 어떻게 알려줄 수 있는지 데이터는 이럴 수 있다. 라고 선언해주려면
Optional 을 사용해야한다.
옵셔널은 내부적으로 enum처럼 동작한다.
enum Optional<Wrapped> {
case some(Wrapped)
case none
}
@Model
class ChallengeRecipe {
var startedAt: Date? // 값이 있을 수도 있음
}
이렇게 작성해준다.
startedAt 의 값은 Date 이거나 nil 이 들어갈 수 있다.
이러한 옵셔널 값을 SwiftUI 에서 표현하려면 이렇게 코드를 작성한다.
if let review = recipe.completedReview {
Text("리뷰: \(review)")
}
값이 있다면? 보여주겠다.
또 값에 따라 다르게 분기처리해야하는 경우도 있지 않은가?
Bool, Enum, 값을 비교하는 등등에 대해선 이렇게 표현해준다
enum Dessert: String, Codable {
case cake, bread, cookie
}
var desert: Dessert
var startedAt: Date?
var isStarted: Bool {
startedAt != nil
}
옵셔널 값 꺼내기 (Unwrapping)
옵셔널 값은 기본적으로 "있을 수도 있고, 없을 수도 있다"는 의미를 가진다. 이 값을 꺼내려면, 값이 존재하는지 확인하고 안전하게 처리해야 한다. 옵셔널 값이 nil일 수 있기 때문에, 이를 강제적으로 꺼내려고 하면 런타임 에러가 발생할 수 있다. 이를 해결하기 위해 여러 가지 방법이 있다.
var name: String? = "Jane"
print(name!) // "Jane"
옵셔널 바인딩 (Optional Binding)
옵셔널 바인딩은 옵셔널 값을 안전하게 추출하는 방법이다. if let 또는 guard let을 사용하여, 옵셔널 값이 존재할 때만 그 값을 사용할 수 있도록 처리한다. 이를 통해 값이 nil일 경우, 안전하게 다른 경로로 흐를 수 있다.
if let name = name {
print("이름은 \(name)입니다")
} else {
print("이름이 없습니다")
}
guard let
guard let은 옵셔널 값을 추출한 뒤, 조건을 만족하지 않으면 함수나 루프를 즉시 종료시키는 역할을 한다. guard는 주로 조건이 충족되지 않았을 경우 빠르게 종료하고, 이후의 코드 흐름을 간결하게 만드는 데 유용하다. guard let은 else 절에서 필수로 탈출(return, break, continue)을 해야 한다.
func greet(_ name: String?) {
guard let unwrapped = name else {
print("이름이 없어요")
return
}
print("안녕하세요, \(unwrapped)")
}
Nil 병합 연산자 (??)
Nil 병합 연산자(??)는 옵셔널 값이 nil일 경우 기본값을 제공하는 연산자이다. 옵셔널 값이 nil이 아니면 해당 값을 사용하고, nil이면 오른쪽에 있는 기본값을 대신 사용한다. 이를 통해 옵셔널을 처리할 때 nil 값에 대한 예외 처리를 간편하게 할 수 있다.
let nickname: String? = nil
let displayName = nickname ?? "손님"
print(displayName) // "손님"
옵셔널 체이닝
옵셔널 체이닝은 여러 개의 옵셔널 값을 안전하게 연결하여, 값이 nil일 때 에러 없이 처리할 수 있는 방법이다. ?. 연산자를 사용하여, 옵셔널 값이 존재하는 경우에만 그 속성을 추출하거나 메서드를 호출한다. 이를 통해 중첩된 옵셔널을 처리할 때 유용하다
let user: User? = ...
let city = user?.address?.city
Solution (해결 결과)
조건이 너무 복잡한 코드에
let review = recipe.completedReview
요런 방법으로 분기처리 해서 코드를 정리했다.
Reflection (회고)
아직.. 지금 내 코드는 계속 뭔가 불만족.... 좀 더 깔끔하게 코드를 짤 수 있는 방법이 없을까??🤔
리팩토링은 일단 나중에ㅜ
'iOS > Swift' 카테고리의 다른 글
| Managing your app’s life cycle (0) | 2025.04.30 |
|---|---|
| 상태를 감지하는 방법 (0) | 2025.04.23 |
| SwiftData 에서 여러개의 모델을 가져올 때 어떻게 해야할까? (1) | 2025.04.18 |
| View에서 parameter를 선언할때 var, let 선택 기준 (2) | 2025.04.13 |
| Swift 함수와 Clousure 의 예제코드 (0) | 2025.03.26 |