이번 편의 목표: 값이 없을 수 있는 문자열을 옵셔널로 두고, 값이 있을 때만 사용합니다.

일반 String은 항상 문자열입니다. 빈 문자열과 값이 없음은 다릅니다. 없음은 nil이고, 그 자리를 허용하는 타입은 String?입니다. 물음표가 옵셔널이라는 표시입니다.

Swift
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를 씁니다.

Swift
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이 됩니다.