스터디를 진행하며 처음부터 다시 Swift를 공부하고 있습니다.
오늘 작성할 파트는 옵셔널 입니다.
정말 옵셔널은 스위프트의 꽃이라 생각합니다.
하지만 그만큼 이해하는게 좀 힘든거 같기도 하고..
기존에 우리가 선언했었던 타입은 다 non-Optional Type입니다.
해당 타입은 무조건 값이 존재해야 합니다.
nil
이라는 값을 가질 수 있으면 Optional Type이고,
이 Optional Type을 선언할 땐 타입 옆에 ?
를 붙입니다.
let age : Int? = 19
print("내 나이는 \(age)살 입니다.") //내 나이는 Optional(19)살 입니다.
옵셔널 중에 타입 옆에
?
가 아니라!
를 붙이는 옵셔널 묵시적 추출도 있습니다.
하지만 API에서 IUO를 return 한 경우를 제외하면 어쨌든 IUO도 강제 추출이기 때문에
사용하지 않는 것을 권장합니다.
코딩테스트때는 그래도 값이 지정되어 있다면야 써도 되겠지만 아니라면 그냥 쓰지 않는게 낫습니다.
컴파일 에러로 알려주면 다행이지만.. 개발하고 빌드했을 때 런타임 에러가 나면 얼마나 서럽겠습니까..🥲
옵셔널 언래핑은 nil
을 언래핑 할 수 없는데 강제 추출은 “값이 있건 없건 알바야? 그냥 풀어!”
이런 느낌이기 때문에 추천하지 않습니다.
let age : Int? = 19
print("내 나이는 \(age!)살 입니다.") //내 나이는 19살 입니다.
if-let
, while-let
, guard-let
을 사용하여 옵셔널을 안전하게 언래핑 할 수 있습니다.
예시에서 표현식이 nil인지 여부를 판단하고 nil이 아닌 경우 Unwrapping 한 값을 대입합니다.
let age : Int? = 19
if let optionalAge = age { //optionalAge는 Int, age는 Int? 타입
print(optionalAge) //19
} else {
print(age) //Optional(19)
}
optionalAge의 값이 nil이 아닌 경우, optionalAge을 Unwrapping 한 값을 age에 대입하므로 19입니다.
let empty : Int? = nil
guard let optionalAge = empty else { return }
print(optionalAge)
종류 | if-let | guard-let |
---|---|---|
바인딩된 상수의 scope | if문 안에서만 사용 가능 | guard문 밖에서만 사용 가능 |
사용 | 단순히 옵셔널 처리 값에 대한 피드백만 주고 싶을 때 | 옵셔널 처리 값이 nil인 경우 무조건 함수의 실행을 종료 시킬 때 |