Swift #6: 옵셔널
Source: Dev.to
옵셔널
때때로 변수에 값이 없음을 표시해야 할 필요가 있습니다. 이런 경우 Swift는 ? 수식자를 제공하여 모든 데이터 타입을 옵셔널로 만들 수 있습니다. 옵셔널 변수는 값을 가질 수도 있고 비어 있을 수도 있습니다(nil 값).
var result: Int? // 기본값은 nil
result = 1
result = nil
암시적 언래핑 옵셔널 (Implicitly Unwrapped Optionals)
어떤 경우에는 옵셔널 변수가 사용될 때 항상 값을 가지고 있지만, 초기값을 무엇으로 설정해야 할지 모를 때가 있습니다. 이런 옵셔널 변수는 ? 대신 ! 로 선언되며, 표현식 안에서 사용할 때는 반드시 값이 있다고 간주됩니다.
var x: Int!
x = 3
var result = x * 2 // 6
값을 읽을 때 다시
!를 사용할 필요가 없습니다.
옵셔널 언래핑
강제 언래핑 (Forced unwrap)
옵셔널이 nil이 아님을 100 % 확신할 때만 ! 로 값을 추출할 수 있습니다.
let optionalValue: Int? = 5
let value = optionalValue! // value: Int = 5
옵셔널 바인딩 (if let/var, guard let/var)
옵셔널이 nil이 아닌지 확인하고 안전하게 사용하려면 Swift는 옵셔널 바인딩 구문을 제공합니다.
var optionalValue: Int? = 5
if let value = optionalValue {
print(value)
}
if var value = optionalValue {
print(value)
}
같은 이름 재사용
var value: Int? = 5
if let value = value {
print(value)
}
if var value = value {
print(value)
}
Swift 5.7부터는 옵셔널 바인딩에서 선언하는 상수·변수 이름이 옵셔널 자체와 동일할 경우 구문을 간략화할 수 있습니다:
var value: Int? = 5
if let value {
print(value)
}
if var value {
print(value)
}
guard와 함께 사용
guard let value else {
return
}
guard var value else {
return
}
추가 조건
var value: Int? = 5
if let value, value > 3 {
print(value)
}
참고: 이름이 같더라도 옵셔널 바인딩에서 만든 상수·변수와 원본 옵셔널은 메모리 상에서 별개의 객체입니다.
옵셔널 체이닝
let optionalName = optionalValue?.name
널 병합 연산자 (??)
옵셔널이 nil일 경우 기본값을 반환합니다.
let value = optionalNumber ?? 0
패턴 매칭 (case let)
let optionalValue: Int? = 77
switch optionalValue {
case let value?:
print(value)
case nil:
print("nil")
}