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

Categories:

Updated:

Leave a comment