프로그래밍/Swift
옵셔널 ( Optional )
시르베어
2024. 4. 16. 21:45

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

열거형의 case는 두가지가 있다
- case some(Wrapped)
- Wrapped 라는 연관값을 가지는 값이 있는 case some
- 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