반응형
안녕하세요 공공돌🧸 입니다.
옵셔널 추출에 대해 정리 해봤습니다.
1. 옵셔널 추출
1. 옵셔널 추출이란?
- 옵셔널에 들어있는 값을 사용하기 위해 꺼내오는 것
2. 옵셔널 방식
- 옵셔널 바인딩
1. nil 체크 + 안전한 추출
2. 옵셔널 안에 값이 들어있는지 확인하고 값이 있으면 값을 꺼내옵니다.
3. if-let 방식 사용
func printName(_ name: String) {
print(name)
}
var myName: String? = nil
//printName(myName)
// 전달되는 값의 타입이 다르기 때문에 컴파일 오류발생
if let name: String = myName {
printName(name)
} else {
print("myName == nil")
}
var yourName: String! = nil
if let name: String = yourName {
printName(name)
} else {
print("yourName == nil")
}
// name 상수는 if-let 구문 내에서만 사용가능합니다
// 상수 사용범위를 벗어났기 때문에 컴파일 오류 발생
//printName(name)
// ,를 사용해 한 번에 여러 옵셔널을 바인딩 할 수 있습니다
// 모든 옵셔널에 값이 있을 때만 동작합니다
myName = "GGDol"
yourName = nil
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// yourName이 nil이기 때문에 실행되지 않습니다
yourName = "Bin"
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// GGDol and Bin
- 강체추출 : 옵셔널에 값이 들어있는지 아닌지 확인하지 않고 강제로 값을 꺼내는 방식, 만약 값이 없을경우(nil) 런타임 오류가 발생하기 때문에 추천되지 않습니다.
var myName: String? = GGDol
var youName: String! = nil
printName(myName!) // GGDol
myName = nil
//print(myName!)
// 강제추출시 값이 없으므로 런타임 오류 발생
yourName = nil
//printName(yourName)
// nil 값이 전달되기 때문에 런타임 오류발생
2. 생각해보기
▶ 옵셔널은 어떤 상황에서 사용되며 어떤 방식으로 추출을 해야할까요?
공공돌의 생각💬
옵셔널의 사용 예시로 아래와 같이 정리해봤습니다.
1. 값이 없을 수 있는 상황
var username: String? // 사용자 이름이 없을 수 있다.
// 어떤 로직을 통해 사용자 이름을 설정한다.
// ...
// 사용자 이름이 없을 경우 기본값을 출력하도록 한다.
let displayUsername = username ?? "Guest"
print("Welcome, \(displayUsername)!")
이름이 설정되지 않은 사용자가 있을때 옵셔널을 사용하여 기본값을 설정할 수 있습니다.
2. 네트워크 요청 결과 처리
func fetchData(completion: (String?, Error?) -> Void) {
// 네트워크 요청을 통해 데이터를 가져온다.
// ...
if let data = receivedData {
completion(String(data: data, encoding: .utf8), nil)
} else {
completion(nil, NetworkError.dataNotFound)
}
}
네트워크 요청이 성공이더라도 받아오는 데이터가 없을 수 있으므로, 옵셔널을 사용하여 데이터의 존재 여부를 표현할 수 있습니다.
자신이 책임질 수 있는 상황이 아니라면 옵셔널 강제추출은 하지 않는것이 무 조 건 좋습니다.
옵셔널 바인딩을 활용하여 안전하게 추출합시다 😆
공부하는 공돌이, 공공돌입니다🐻
@sheep1sik
출처 : 야곰 iOS 프로그래밍을 위한 스위프트 기초
반응형
'iOS > Swift 기초' 카테고리의 다른 글
[ Swift 기초 ] 클래스 (1) | 2024.01.10 |
---|---|
[ Switf 기초 ] 구조체 (1) | 2024.01.09 |
[ Swift 기초 ] 옵셔널 (1) | 2024.01.07 |
[ Swift 기초 ] 반복문 (2) | 2024.01.06 |
[ Swift 기초 ] 조건문 (1) | 2024.01.05 |