프로그래밍/Swift

옵셔널 ( Optional )

시르베어 2024. 4. 16. 21:45

옵셔널이란 특정값이 있거나 값이 없음을 표현한 타입으로 구현은 열거형으로 되어있다.

열거형의 case는 두가지가 있다

  1.  case some(Wrapped) 
    • Wrapped 라는 연관값을 가지는 값이 있는 case some
  2. case none
    • 값이 없는 case none

 

옵셔널 표현 방법 ( 자료형? vs Optional<자료형> )

var name: String? = "Syrbear"
var name: Optional<String> = Optional<String>("Syrbear")

옵셔널을 표현하는 방식은 두가지로 단순하게 자료형 뒤에 물음표(?)를 붙이는 방법과 Optional<자료형>이라는 자료형 전체를 작성하는 방법이 두가지가 있는데 사용하기에 편리하기에 자료형 뒤에 물음표를 쓰는 방법을 많이 쓴다

 

옵셔널 값 추출

1. 강제추출 ( Forced Unwrapping )

  • 가장 쉬운 방법이자 가장 위험한 방법
  • 느낌표(!)를 사용해 강제로 옵셔널 값을 추출할 수 있다
  • 만약 값이 nil이라면 오류가 발생한다
var name: String? = "Syrbear"
print(name!)
name = nil
print(name!) // 오류 발생

 

 

2. 암시적(묵시적) 추출

  • 로직상 오류가 발생하지 않을 거 같다고 확신이 들때 사용하는 방법
  • 옵셔널의 물음표(?) 대신 느낌표(!)를 사용
var name: String! = "Syrbear"
name = nil
print("Hi, My name is \(name)") // Hi, My name is nil

var number: Int! = 10
print(number + 5) // 15
number = nil
print(number + 5) // 오류발생

 

 

3. 옵셔널 바인딩 ( Optional Binding )

  • 옵셔널에 값이 존재하는지 확인 후 사용하는 방법
let imagePaths = [
    "star": "/glyphs/star.png",
    "portrait": "/images/content/portrait.jpg",
    "spacer": "/images/shared/spacer.gif"
]
                  
if let starPath = imagePaths["star"] {
    print("The star image is at '\(starPath)'")
} else {
    print("Couldn't find the star image")
} // Prints "The star image is at '/glyphs/star.png'"

★이후 설명을 위해 공식문서에 나온 예제로 설명진행

imagePaths는 딕셔너리 타입이므로 star의 값이 존재하지않을 경우 starPath는 nil되어 if 코드가 아닌 else코드가 진행된다

 

옵셔널 체이닝 ( Optional Chaining )

  • 옵셔널에 속해 있는 프로퍼티, 메서드 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정
  • 정상적으로 호출이 가능하면 호출을 진행하고 불가능할 경우 nil을 반환
if let path = imagePaths["star"] {
    if path.hasSuffix(".png") == true {
        print("The star image is in PNG format")
    }
}// Prints "The star image is in PNG format"

if imagePaths["star"]?.hasSuffix(".png") == true {
    print("The star image is in PNG format")
}// Prints "The star image is in PNG format"

첫번째 if구문은 체이닝을 사용하지 않은 경우이고 두번째 구문은 체이닝을 사용한 경우이다
두번째 구문이 첫번째보다 간결해 진것을 볼 수 있다

 

Nil-Coalescing Operator ( 닐-코얼레이싱 )

  • ?? 연산자를 통해 기본값을 제시 해주는 방법
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath) // Prints "/images/default.png"

간단히 설명을 하면 ?? 앞의 값이 nil이면 ??뒤의 값을 사용하겠다 라는 뜻이다

 

빠른 종료 ( guard )

  • if 구문과 비슷하게 Bool 타입의 값으로 동작하는 기능으로 True일 경우 코드는 계속 진행되고 False일 경우 guard구문이 실행되는 구조를 가진다 ( 주로 제어문 전환 명령을 실행함 - return, break, continue, throw 등 )
let arr: [String?] = ["apple","banana",nil,nil,"edd"]

for str in arr {
    guard let name = str else{
        continue
    }
    print(name)
} // apple banana edd

 

 

 

 

옵셔널 공식문서 : https://developer.apple.com/documentation/swift/optional

 

Optional | Apple Developer Documentation

A type that represents either a wrapped value or the absence of a value.

developer.apple.com