본문 바로가기
Swift

[Swift] 9. optional 옵셔널

by CodingKwon 2021. 10. 6.

1. optional 옵셔널

  • 값이 있을 수도 있고 없을 수도 있음
  • nil의 가능성을 명시적으로 표현해주는 기능 (문서화 하지 않아도 코드만으로 표현 가능)
    • 문서/주석 작성시간 절약
  • 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않더라도 안심하고 사용
    • 효율적인 코딩
    • 예외 상황을 최소화하는 안전한 코딩

 

2. Implicitly Unwrapped Optional 암시적 추출 옵셔널

// ! 사용
var optionalValue: Int! = 100
switch optionalValue {
case .none:
 print("This Optional variable is nil")
case .some(let value):
 print("Value is \(value)")
}

// 기존 변수처럼 사용 가능
optionalValue = optionalValue + 1
// nil 할당 가능
optionalValue = nil
// 잘못된 접근으로 인한 런타임 오류 발생
optionalValue = optionalValue + 1

 

// ? 사용
var optionalValue: Int? = 100
switch optionalValue {
case .none:
 print("This Optional variable is nil")
case .some(let value):
 print("Value is \(value)")
}

// nil 할당 가능
optionalValue = nil
// 기존 변수처럼 사용불가 - 옵셔널과 일반 값은 다른 타입이므로 연산불가
optionalValue = optionalValue + 1

 

3. Optional Unwrapping

  • Optional Binding : 옵셔널 바인딩
  • Force Unwrapping : 강제 추출

 

4. Optional Binding

  • 옵셔널의 값을 꺼내오는 방법
  • nil 체크 + 안전한 값 추출
func printName(_ name: String) {
 print(name)
}
var myName: String? = nil
printName(myName)
// 전달되는 값의 타입이 다르기 때문에 컴파일 오류발생

 

4-1. if-let

// ? 사용
func printName(_ name: String) {
 print(name)
}
var myName: String? = nil
if let name: String = myName {
 printName(name)
} else {
 print("myName == nil")
}
// name 상수는 if-let 구문 내에서만 사용가능합니다
// 상수 사용범위를 벗어났기 때문에 컴파일 오류 발생
printName(name)

 

// ! 사용
func printName(_ name: String) {
 print(name)
}
var myName: String! = nil
if let name: String = myName {
 printName(name)
} else {
 print("myName == nil")
}
// name 상수는 if-let 구문 내에서만 사용가능합니다
// 상수 사용범위를 벗어났기 때문에 컴파일 오류 발생
printName(name)
  • Optional Binding을 if-let에서 사용 시 구문 내에서만 사용 가능

 

5. Force Unwrapping

  • 옵셔널의 값을 강제로 추출
func printName(_ name: String) {
 print(name)
}
var myName: String? = "kwon"
printName(myName!) // kwon
myName = nil
print(myName!)
// 강제추출시 값이 없으므로 런타임 오류 발생
var yourName: String! = nil
printName(yourName)
// nil 값이 전달되기 때문에 런타임 오류발생

 

'Swift' 카테고리의 다른 글

[Swift] 11. 클래스  (0) 2021.10.06
[Swift] 10. 구조체  (0) 2021.10.06
[Swift] 8. 반복문  (0) 2021.10.05
[Swift] 7. 조건문  (0) 2021.10.05
[Swift] 6. 함수  (0) 2021.10.05

댓글