티스토리 뷰

Swift

[Swift] 옵셔널 추출

Esiwon 2022. 2. 14. 11:21

지난 게시물에 옵셔널에 대한 글이 있는데 이번엔 그 글에 연장인 옵셔널 추출에 관한 이야기를 써볼까 한다.

그 당시엔 몰랐지만, 옵셔널 추출에 관해 찾아보면서 다양한 추출방법이 있었고, 오늘 글로 담지 못한 방법 또한, 많을것이라 생각이 든다. 오늘로 또 다시 한주가 시작 됐는데 이번주는 어떨까?

 

Optional 추출은,

  • 옵셔널 바인딩(Optional Binding)
  • 옵셔널 체이닝(Optional Chaining)
  • nil병합(Using the Nil-Coalescing Operator)
  • 강제 언래핑(Unconditional Unwrapping)

사용하여 옵셔널 값을 일반 값으로 꺼내올 수 있다.

 

옵셔널 바인딩은,

값이 있을 때와 없을 때 상활을 각각 분리하여 값이 있을 때는 해당 값을 상수 또는 변수에 담고 중괄호 내부에서 사용할 수 있으며, 값이 없을 시 else 문을 실행하여 오류 출력을 피할 수 있습니다. 옵셔널 바인딩은 if let, guard let, switch 문법을 사용하여 값을 추출할 수 있습니다.

if let,

if 문법을 활용한 추출방법 nil이 아니면 if문을 nil이면 else문을 실행
var myName: String! = nil

if let name: String = myName {
    print("myName에 이름이 들어가 있습니다.")
} else {
    print("myName에 이름이 안들어 있습니다.")
}

guard let,

guard 문법을 활용한 추출방법 guard는 if 문에 반대의 특성을 가져 nil 이면 조건문이 실행되고, nil이 아니면 다음 문장이 실행된다. guard와 if 문의 차이는 if 문은 추출 값을 조건문 내부에서만 사용할 수 있지만, guard는 외부에서 사용이 가능
var myName: String! = nil

guard let name: String = myName else { 
	print("myName에 이름이 안들어 있습니다.")
	return 
}
print("myName에 이름이 \(name)이들어 있습니다.")

switch,

switch 문법을 활용한 추출방법은. none 값이 없을 때, .some 값이 있을 때, 또한 특정 값에 대한 다양한 조건에 따라 다른 실행문을 넣어줄 수 있다는 장점이 있다. 때문에 원하는 값이 따로 있는 상황에서 활용하기 좋다.
import Foundation
var myName: String! = "이시원"

switch myName {
case .none:
    print("myName에 이름이 안들어 있습니다.")
case "이시원":
    print("myName에 이름이 \"이시원\"이들어 있습니다.")
case .some(let name):
    print("myName에 이름이 \"\(name)\"이들어 있습니다.")
}

 

옵셔널 체이닝은,

구조체 등으로 인해 옵셔널 타입을 연속으로 체크해야 할 때 상황에서 옵셔널을 '?'를 이용하여 연결해 앞 옵셔널 타입부터 순차적으로 값이 있는지 판단하고 없으면 동작을 멈추고 nil을 반환
struct Person {
    let name: String
    var phone: Phone?
    init(name: String) {
        self.name = name
    }
}

struct Phone {
    let brand: String
    var phoneCaseColor: String?
    init(brand: String){
        self.brand = brand
    }
}

var siwon: Person? = Person(name: "이시원")
let myPhone: Phone? = Phone(brand: "애플")
siwon?.phone = myPhone
siwon?.phone?.phoneCaseColor = "RED"

if siwon?.phone?.phoneCaseColor != nil {
    print("\(siwon?.name)의 핸드폰 케이스 색은 \(siwon?.phone?.phoneCaseColor)입니다")
} else {
    print("\(siwon?.name)은 핸드폰 케이스를 사용 안합니다.")
}
//Optional("이시원")의 핸드폰 케이스 색은 Optional("RED")입니다

nil 병합은,

옵셔널을 상수 또는 변수에 담을 때 뒤에 " ?? " 붙여 옵셔널에 값이 없으면 " ?? " 뒤에 있는 값을 대신 넣어준다 때문에, 옵셔널 값이 없을 때 기본값을 넣어줘야 할 때 사용할 수 있다.
struct Person {
    let name: String
    var phone: Phone?
    init(name: String) {
        self.name = name
    }
}

struct Phone {
    let brand: String
    var phoneCaseColor: String?
    init(brand: String){
        self.brand = brand
    }
}

var siwon: Person? = Person(name: "이시원")
let myPhone: Phone? = Phone(brand: "애플")
siwon?.phone = myPhone
//siwon?.phone?.phoneCaseColor = "RED"
var CaseColor: String = siwon?.phone?.phoneCaseColor ?? "투명"

print("핸드폰 케이스 색은 \(CaseColor)입니다")
//핸드폰 케이스 색은 투명입니다

강제 추출은,

옵셔널 뒤에 '!'를 붙여 값이 있을 경우 일반 변수처럼 사용할 수 있게 해준다. 사용이 쉽지만 옵셔널 값이 nil인 경우 오류가 발생할 수 있어 안전한 방법은 아니다.

'Swift' 카테고리의 다른 글

[Swift] Protocol  (0) 2022.02.23
[Swift] 객체지향(OOP)  (0) 2022.02.23
[Swift]Swift random(), randomElement() 함수 알아보기  (0) 2022.02.11
[Swift]Class, Instance, Object 알아보기  (0) 2022.02.07
[Swift]옵션널 기본  (1) 2022.01.31
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함