이번 편의 목표: 값이 없을 수 있는 문자열을 옵셔널로 두고, 값이 있을 때만 사용합니다.
일반 String은 항상 문자열입니다. 빈 문자열과 값이 없음은 다릅니다. 없음은 nil이고, 그 자리를 허용하는 타입은 String?입니다. 물음표가 옵셔널이라는 표시입니다.
var title: String? = nil
print(title == nil)
title = "개미"
if let title {
print(title)
}
let priceText: String? = "12000"
let price = Int(priceText ?? "") ?? 0
print(price)처음 비교는 true입니다. if let은 옵셔널 안에 값이 있을 때만 중괄호로 들어가고, 그 안의 title은 이미 String입니다. 밖의 title은 여전히 String?입니다. 이름이 같아도 중괄호 안에서는 꺼낸 값이 우선합니다.
??는 왼쪽이 nil일 때 오른쪽을 씁니다. Int("12000")은 변환에 성공해 12000이 되고, 실패하면 nil이라 오른쪽의 0이 됩니다.
함수를 빠져나가야 할 때는 guard를 씁니다.
func printTitle(_ title: String?) {
guard let title else {
print("제목이 없습니다.")
return
}
print(title)
}guard 이후의 title은 String입니다. nil이면 return한 뒤이므로, 그 아래에서는 값이 있다고 보고 출력합니다. 옵셔널 뒤에 느낌표를 붙여 강제로 꺼내는 방식은 값이 없을 때 실행이 멈추므로 이 연재에서는 쓰지 않습니다.
직접 해 보기
priceText를 abc로 바꿔 출력이 0이 되는지 확인하세요. 이어서 nil을 넣어 같은 결과인지 확인합니다.
해설
abc는 Int로 바뀌지 않아 nil이 되고 ??가 0을 선택합니다. priceText 자체가 nil이어도 ?? "" 때문에 빈 문자열이 되고, Int 변환이 실패해 다시 0이 됩니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.