Optional, Optional Chaining
Updated:
🔷 Optional
- Swift 에서 옵셔널 이란?: 값이 있을 수 도 있고, 없을 수 도 있다는 상태를 말함
// 옵셔널?
// 값이 있는지 없는지 모른다.
// 값이 있으면 Int type 이고 없으면 nil 이라는것임
var someVariable: Int? = nil
if someVariable == nil {
someVariable = 90
}
print("somVariable: \(someVariable)") // Optional (90)
🔷 Unwrapping
- 감싸져있는것을 벗기는것 - optional 의 값을 벗겨 내는것
// unwrapping 하는 방법 1
// 감싸져있는것을 벗기는것 - optional 의 값을 벗겨 내는것
// someVaribale 에 값이 있으면 otherVariable 값을 넣는 다는것
if let otherVariable = someVariable {
print("언래핑되어 값이 있다 : \(otherVariable)") // 90 출력됨
} else { // 값이 없을때
print("값이 없다")
}
// unwrapping 하는 방법 2
// someVariable 에 값이 없을때
someVariable = nil
// someVariable 이 비어있을 경우, 즉 값이 없을 경우에 기본값 설정하기
let myValue = someVariable ?? 10 // 값이 없을 경우에 10을 넣기
print("myValue: \(myValue)") // myValue: 10
// unwrapping 하는 방법 3
var firstValue : Int? = 30
var secondValue : Int? = 50
// unwrapping 을 하지 않은 상태
print("firstValue : \(firstValue)") // firstValue : Optional(30)
print("secondValue : \(secondValue)") // secondValue : Optional(50)
func unwrap(_ parameter: Int?) {
print("unwrap() called")
// 값이 없으면 return 해버림 if let {} else {} 와 같은건데 줄여서 guard let 으로 자주 쓰임 (값이 없으면 지나간다 라는 뜻임)
guard let unWrappedParm = parameter else { return }
print("unWrappedParam: \(unWrappedParm)")
}
// guard let 을 통한 unwrapping 하기
unwrap(firstValue) // unWrappedParam: 30
unwrap(secondValue) // unWrappedParam: 50
🔷 Optional Chaining
struct Friend {
let nickname: String
let person: Person?
}
struct Person {
let name: String
let pet: Pet?
}
struct Pet {
let name: String?
let kind: String
}
let pet = Pet(name: "코코", kind: "강아지")
let person = Person(name: "Jacob", pet: pet)
let friend = Friend(nickname: "jacobkosmart", person: nil)
// 이런식으로 Optional 이 연쇄적으로 있을때
if let person = friend.person {
if let pet = person.pet {
if let petName = pet.name {
print("petName: \(petName)")
}
}
}
// Optional Chaining
// 한번만 unwrapping 하고 나머지는 optional 처리가 가능합니다
if let petName = friend.person?.pet?.name {
print("petName: \(petName)")
} else {
// person, pet, name 중 하나가 nil 이면
print("팻 이름이 없어요") // 펫 이름이 없어요
}
🔷 case let optional pattern
case let 을 활용해서 optional 에서 nil 을 제외하고 collection 에서 값이 있는 것만 가져 올수 있습니다.
let friends: [String?] =
[nil, "Jacob", "Emma", nil, "John"]
for case let friend? in friends {
print("Find my Friend: \(friend)")
}
// Find my Friend: Jacob
// Find my Friend: Emma
// Find my Friend: John
Reference
Swift official docs Enumerations- https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html
개발하는 정대리 스위프트 기초 문법 - 5일차 / Unwrap 옵셔널 변수 - https://www.youtube.com/watch?v=60VSuIY81iQ
Leave a comment