[Swift] Optional

olraedev·2024년 1월 14일

Swift

목록 보기
1/1
post-thumbnail

💡 Optional

안전성이 높은 Swift에서 값을 처리하는 과정에서 발생할 수 있는 오류를 최대한 피하고자 도입한 개념

Optional은 ? 를 통해 표현합니다.

let nickname: String?
nickname = "RRAE"

print(nickname)

위 예시에서 nickname은 값이 있을 수도, 없을 수도 있기 때문에 Optional("RRAE") 라는 Optional로 포장(wrapping) 되어있는 출력 결과를 볼 수 있습니다.

이렇게 오류를 최대한 피하는 것은 좋지만, 앱에서 닉네임이 Optional로 포장 되어 있는 값으로 보여줄 수는 없죠... 그래서 올바른 출력값을 보여주기 위해 Unwrapping을 해야합니다!

💡 Unwrapping

1. 강제 추출 (Forced Unwrapping)

값이 100% 문제가 없을 때, !를 사용해 unwrapping할 수 있습니다.
하지만, 값이 nil일 경우에 앱이 꺼질 수도 있다는 아주아주 극단적인 방법입니다.

let nickname: String?
nickname = "RRAE"

print(nickname!)

출력값은 Optional이 unwrapping된 저의 닉네임인 RRAE가 제대로 나오는 모습을 볼 수 있습니다


let nickname: String?
nickname = nil

print(nickname!)

닉네임 변수의 nil값을 저장하고 강제 추출을 하게 되면 빨간색의 무서운 오류를 만날 수 있습니다.

2. Optional Binding

Optional Binding은 Forced Unwrapping보다 소심해서 먼저 Optional타입으로 선언된 변수에 값이 nil인지 아닌지를 확인합니다.

⭐︎ if-let 방식

  • if-let 방식으로 할당된 상수는 if 구문 안에서만 사용 가능
let nickname: String? = "RRAE"

if let myNickname = nickname {
	print(myNickname)
} else {
    print("nil")
}

nickname에 값이 있을 경우 Optional 타입 변수인 nickname의 값이 unwrapping되어 myNickname 상수에 저장되어 정상적인 값이 출력됩니다.
하지만, nickname 값이 nil일 경우 else문이 실행되게 됩니다.

❗️초미세먼지 팁

  • 개발자들이 가장 시간을 많이 쏟는 변수명 짓는 시간 줄이기!!
    (Swift 5.7⬆️ 부터 단축 구문(Shorthand Syntax) 도입)
let nickname: String? = "RRAE"

if let nickname {
	print(nickname)
} else {
    print("nil")
}
  • 여러 Optional 타입 바인딩
let nickname: String? = "RRAE"
let age: Int? = 100

if let nickname, let age {
	print(nickname, age)
} else {
    print("nil")
}

⭐︎ guard 방식

  • guard 방식으로 할당된 상수는 guard 구문이 작성된 범위 내에서 사용 가능
let nickname: String? = "RRAE"
        
guard let myNickname = nickname else {
	print("nil")
	return
}

print(myNickname)

if-let 방식과 유사하지만, nickname의 값이 nil일 경우를 먼저 확인해서 값이 nil이면 else구문이 실행이 되어 return 이 됩니다. nil이 아닐 경우에는 정상적인 값이 출력됩니다.

guard방식도 if-let방식과 똑같이 단축 구문을 사용할 수 있고, 여러 Optional 타입 변수를 바인딩 할 수 있습니다!!

let nickname: String? = "RRAE"
let age: Int? = 100

guard let nickname, let age else {
	print("nil")
    return
}

print(nickname, age)

3. nil 병합 연산자

  • 조건문의 길이를 줄이고 코드의 가독성을 개선할 수 있음
let nickname: String? = "RRAE"

print(nickname ?? "손님")

?? 를 기준으로 좌측에는 정상적인 값이 있을 경우, 우측에는 nil일 경우 출력되는 값을 작성하면됩니다.

profile
iOS Developer

0개의 댓글