서버 API가 항상 동일한 데이터를 보내는 것은 아니기 때문에, 사용자 이름이 항상 존재한다고 가정하면 안 됩니다. 이 경우 모델에서 해당 값을 Optional 타입으로 선언하여 값이 없을 가능성을 표현해야 합니다.
예를 들어 이름이 없는 경우에는 UI에서 기본 문구(예: "사용자")를 표시하거나, 해당 UI 영역을 숨기는 방식으로 처리할 수 있습니다. 이렇게 하면 서버 응답 구조가 유동적이어도 앱이 안정적으로 동작할 수 있습니다.
Swift에서는 값이 있을 수도 있고 없을 수도 있는 경우를 Optional 타입으로 표현합니다.
예를 들어 User 모델에서 사용자 이름을 다음과 같이 선언할 수 있습니다.
struct User {
let name: String?
}
이렇게 선언하면 name 값은 문자열이 있을 수도 있고 nil일 수도 있습니다.
Swift는 Optional을 통해 nil 가능성을 타입 시스템에서 강제하기 때문에, 개발자가 값을 사용할 때 반드시 nil 여부를 확인하도록 만들어 안정성을 높여줍니다.
Optional 값에 대해 !를 사용하면 강제 언래핑(Force Unwrapping) 이 이루어집니다.
예를 들어 다음과 같은 코드가 있다고 가정해보겠습니다.
let name = user.name!
만약 서버가 이름을 보내지 않아 user.name이 nil이라면, nil을 강제로 꺼내려고 하기 때문에 앱이 즉시 크래시하게 됩니다.
이러한 문제를 방지하기 위해서는 다음과 같은 안전한 언래핑 방식을 사용해야 합니다.
if letguard letnil-coalescing operator (??)예시:
let name = user.name ?? "사용자"
이렇게 하면 이름이 없을 경우 기본 값을 사용할 수 있어 앱의 안정성을 높일 수 있습니다.
API 응답 데이터는 종종 여러 단계로 중첩된 구조를 가지고 있습니다. 이 경우 Optional Chaining을 사용하면 안전하게 값을 접근할 수 있습니다.
예시:
let name = response.user?.profile?.name
이 코드는 다음과 같은 특징을 가집니다.
user가 nil이면 결과는 nilprofile이 nil이면 결과는 nilname이 존재하면 해당 값을 반환즉, 중간 단계 중 하나라도 nil이면 전체 결과가 nil이 되며 크래시가 발생하지 않습니다.
이 방법은 특히 JSON 파싱 과정에서 안전성을 높이는 데 매우 유용합니다.
iOS 앱의 생명주기(App Life Cycle)는 앱이 실행되고 종료될 때까지 거치는 상태 변화 과정을 의미합니다.
앱은 실행 중에 여러 상태를 오가며, 각 상태에서 시스템은 특정 메서드를 호출합니다.
개발자는 이러한 상태 변화에 맞춰 다음과 같은 작업을 수행합니다.
iOS 13 이후에는 AppDelegate와 함께 SceneDelegate 기반의 생명주기 관리도 함께 사용됩니다.
앱이 실행되지 않은 상태입니다.
사용자가 앱을 실행하거나 시스템이 앱을 실행하기 전까지 메모리에 존재하지 않습니다.
앱이 실행 중이지만 사용자 입력을 받지 않는 상태입니다.
예시
이 상태는 보통 Active ↔ Background 전환 과정에서 잠깐 나타나는 상태입니다.
앱이 포그라운드에서 정상적으로 실행되는 상태입니다.
가능한 작업
일반적인 앱 사용 상태입니다.
앱이 화면에는 보이지 않지만 코드를 실행할 수 있는 상태입니다.
가능한 작업
하지만 실행 시간에는 제한이 있으며, 필요할 경우 Background Task를 요청해야 합니다.
앱이 메모리에 유지되지만 코드 실행이 중단된 상태입니다.
이 상태에서는
시스템이 필요하면 언제든지 앱을 종료할 수 있습니다.
요약