λ΄ λΈλ‘κ·Έ 첫 κΈλ‘ μ΅μ λμ λν λ΄μ©μ μ λ‘λνμλ€.
κ·Έλ μκ°νκΈ°λ₯Ό, λ΄κ° μ€μννΈμ λν΄ κ³΅λΆνλ€λ³΄λ ?μ !λ₯Ό μ νκ² λμλ€κ³ νλ κΈ°μ΅,,
κ·Έ λ μ ?μ λν΄μ μκ°λ₯Ό νλ€λ©΄ κ·Έμ μ΄μ΄ μ€λμ !μ λν΄ μ€λͺ ν΄λ³΄λ €κ³ νλ€.
μ΅μ λμΈ κ°μ μ΅μ λμ΄ μλ κ°μΌλ‘ μΆμΆν΄μ£Όλ λ°©λ²λ€μ μ 리ν΄λ³΄μ!
(μ΅μ λμ λν΄ λͺ¨λ₯΄μλ λΆμ΄λΌλ©΄ μ¬κΈ°πλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ!)
2021.06.06 - [π Swift Note/π Concept Summary] - [Swift] Optional(μ΅μ λ) μ 리
π μ΅μ λ μΆμΆ (Optional Unwrapping)
μ΅μ λ μΆμΆμ λ§ κ·Έλλ‘ μ΅μ λμΈ κ°μ μ΅μ λμ΄ μλ κ°μΌλ‘ μΆμΆν΄μ£Όλ κ²μ λ»νλ€.
μ€μννΈλ μ΅μ λ νμ κ³Ό λ Ό μ΅μ λ νμ μ μ² μ ν ꡬλΆνμ¬ μ²λ¦¬νκΈ° λλ¬Έμ,
λ Ό μ΅μ λ νμ μ΄ νμν λλ κΌ μ΅μ λ μΆμΆ κ³Όμ μ΄ νμνλ€.
μ΄ μ΅μ λ μΆμΆμ λ¨μν μ΄ν΄νλ©΄ κ·Έμ 'μ΅μ λ -> λ Ό μ΅μ λ' κ³Όμ μ΄μ§λ§
μ νν μ΄ν΄νκΈ° μν΄μλ Unwrappingμ΄λΌλ ν€μλμ μ΄μ μ λ§μΆ°μΌ νλ€.
μλμ μ΅μ λκ³Ό μ΅μ λ μΆμΆμ μ½κ² μ΄ν΄ν μ μλλ‘ κ°λ¨ν κ·Έλ¦Όμ κ·Έλ Έλ€.
μ΄ κ·Έλ¦Όμ 보면, Int!λ‘ μ΅μ
λ νμ λ κ°μ΄ wrapping,
κ·Έλ¦¬κ³ λ€μ wrappingλ κ²μ λ²κ²Όμ λ unwrappingλλ κ²μ νμΈ κ°λ₯νλ€.
π wrappingμ΄ λ°λ‘ μ΅μ λ, unwrappingμ΄ μ΅μ λ μΆμΆμ μλ―Ένλ κ²μ΄λ€.
μ΄λ κ² μ΅μ λμ λ¨μν nilμ λ£μ μ μκ² λ°κΏμ€λ€! 보λ€λ
nilκΉμ§ λ΄μ μ μκ² κ°μΈμ€λ€.λΌλ ννμ΄ μ ννλ€.
π λ°λΌμ μ΅μ λ μΆμΆμ, μ΄ κ°μΈλμ μ΅μ λ κ°μ λ€μ κΊΌλ΄λ κ³Όμ μ΄λ€.!!
μ΄λ κ² μ νν μ΄ν΄ν΄ λμΌλ©΄, μ΄μ 곡λΆν κ°μ μΆμΆκ³Ό μ΅μ λ λ°μΈλ©, 체μ΄λμ μ’ λ μ½κ² 곡λΆν μ μμ κ²μ΄λ€.
π κ°μ μΆμΆ (Forced Unwapping)
κ°μ μΆμΆμ μ΅μ λμ κ°μ μΆμΆνλ κ°μ₯ κ°λ¨ν λ°©λ²μ΄λ€.
μλμ κ°μ μΆμΆμ κ°λ¨ν μμλ₯Ό μμ±νλ€.
var num1: Int? = 1
var num2: Int = num1!
print(num1, num2)
// Optional(1) 1
num2μ κ²½μ° μ΅μ λμ΄ μλκΈ° λλ¬Έμ μ΅μ λ νμ μΈ num1μ κ°μ μ μ₯ν μ μλ€.
λ°λΌμ num1 λ€μ !λ₯Ό λΆμ¬μ κ°μ μΆμΆνμ¬ κ°μ ν λΉν΄μ£Όμλ€.
μ΄λ κ² κ°μ μΆμΆμ κ²½μ°μλ ! νλλ‘ μ½κ² μ΅μ λ μΆμΆμ ν μ μμ§λ§, κ°μ μΆμΆ λ°©μμ μ¬μ©μ μ§μνλ κ²μ΄ μ’λ€.
κ°μ μΆμΆμ μ΅μ λ μΆμΆμ νλ κ°μ₯ κ°λ¨ν λ°©λ²μΈ λμμ κ°μ₯ μνν λ°©λ²μ΄κΈ° λλ¬Έμ΄λ€.
κ·Έ μ΄μ λ₯Ό μμμ λ΄€λ κ·Έλ¦Όμ κ°μ Έμ λ€μ μκ°ν΄λ³΄μ.
κ°μ μΆμΆμ μμ κ°μ΄ μλμ§, μλμ§λ νμΈνμ§ μκ³ κ·Έλ₯ κ°μ λ‘ κ°μ κΊΌλ΄μ€λ λ°©λ²μ΄κΈ° λλ¬Έμ
κ°μ κΊΌλμ λ μμ μ€μ κ°μ΄ μ‘΄μ¬νλ€λ©΄ λ€νμ΄μ§λ§,
κΊΌλλλ° κ°μ΄ μλ€λ©΄(nil μ΄λΌλ©΄) λ°λ‘ λ°νμ μ€λ₯κ° λ°μνκ² λλ€.
μλλ μλͺ»λ κ°μ μΆμΆμ΄ μ§νλμμ λ μ€λ₯κ° λ°μνλ μν©μ μΊ‘μ²ν λ΄μ©μ΄λ€.
μμ μ½λμμλ μ΅μ λμΈ aμ nilμ ν λΉνκ³ , μ΅μ λμ΄ μλ bλ³μμ nilκ°μ΄ μ μ₯λ aλ₯Ό κ°μ μΆμΆνμ¬ μ μ₯νλ€.
μ‘΄μ¬νμ§ μλ κ°μΈ nilμ μ κ·Όμ μλνλ
Fetal error: Unexpectedly found nil while unwrapping an Optional valueλΌλ μ€λ₯λ₯Ό λ³Ό μ μλ€.
π μ΄λ κ² κ°μ μΆμΆμ λ°νμ μ€λ₯μ κ°λ₯μ±μ μΈμ λ κ°κ³ μκΈ° λλ¬Έμ μ§μνλ κ²μ΄ μ’κ³ ,
λ‘μ§μ nil λλ¬Έμ μ€λ₯κ° λ°μν κ°λ₯μ±μ΄ 100% μλ€κ³ νλ¨λ λλ§ μ¬μ©ν΄μΌ νλ€.
(νμ§λ§ μ€μ νλ‘μ νΈμ© νλ‘κ·Έλλ° μ€μλ κ·Έλ΄ μΌμ΄ λλ¬Όλ€.)
κ·ΈλΌ λ³΄λ€ μμ νκ² μ΅μ λ μΆμΆνλ λ°©λ²μ ν λ² μμ보μ.
μμ ν μΆμΆ λ°©λ²μΌλ‘λ μ΅μ λ λ°μΈλ©κ³Ό μ΅μ λ 체μ΄λ μ΄λ κ² λ κ°μ§ λ°©μμ΄ μλ€.
π μ΅μ λ λ°μΈλ© (Optional Binding)
μ΅μ λ λ°μΈλ©μ μΆμΆνλ €λ κ°μ΄ nilμΈμ§ λ¨Όμ νμΈνκ³ μΆμΆνλ λ°©μμ΄λ€.
μ΅μ λ λ°μΈλ©μ λ³΄ν΅ if λλ while ꡬ문 λ±κ³Ό κ²°ν©νμ¬ μ¬μ©νλ€.
μλμ κ°λ¨ν μ΅μ λ λ°μΈλ©μ νμΈν μ μλ μ½λλ₯Ό μμ±νλ€.
var num: Int? = nil
if var number = num {
number = 2
print(number)
}
else {
print("num is nil")
}
// num is nil
λ³΄ν΅ ifλ¬Έμ varλ₯Ό μ¬μ©ν μ μμ§λ§, μ΅μ λ λ°μΈλ©μμλ if var νΉμ if letμ μ¬μ©ν μ μλ€.
μμ if var number = numμ μλ―Έλ
'λ§μ½ μ΅μ λμ΄ μλ number λ³μμ μ΅μ λμΈ num κ°μ ν λΉ ν μ μμΌλ©΄'μ΄λΌλ λ»μ κ°μ§λ€κ³ μκ°νλ©΄ μ½λ€.
λ°λΌμ μμ μ½λλ₯Ό 보면, num κ°μ νμ¬ nilμ΄ μ μ₯λμ΄ μμΌλ―λ‘ elseμ ν΄λΉνλ λμμ μννλ€.
λ§μ½ κ°μ΄ μ‘΄μ¬νλ€λ©΄ μ΅μ λμμ μΆμΆν κ°μ μμλ λ³μλ‘ ν λΉνμ¬ μ΅μ λμ΄ μλ ννλ‘ μ¬μ©ν μ μκ² ν΄μ€λ€.
π μ΅μ λ 체μ΄λ (Optional Chaining)
μ΅μ λ 체μ΄λμ μ΄λ¦μμλΆν° λκ»΄μ§λ―,
μ΅μ λμ λ°λ³΅μ¬μ©νμ¬ μ΅μ λμ΄ μ²΄μΈμ²λΌ 꼬리μ 꼬리λ₯Ό λ¬Όκ³ μλ λͺ¨μμ΄λ€.
체μΈμ²λΌ μλ‘κ° μ΄μ΄μ ΈμκΈ° λλ¬Έμ μ€κ°μ νλλΌλ κ°μ΄ μ‘΄μ¬νμ§ μμΌλ©΄ (nilμ΄λ©΄) λ°λ‘ nilμ λ°ννλ€.
μ΄μ λν λ΄μ©μ λ°λ‘ μ½λλ‘ μ΄ν΄λ³΄μ.
class Person {
var name: String
var info: Info?
init(name: String) {
self.name = name
}
}
class Info {
var phoneNum: Int
var adress: Adress?
init(phoneNum: Int) {
self.phoneNum = phoneNum
}
}
class Adress {
var city: String
var street: String?
init(city: String) {
self.city = city
}
}
let seolhee: Person = Person(name: "seolhee")
// μ΅μ
λ 체μ΄λμ ν΅ν μΆμΆ
let seolheeInfo: String? = seolhee.info?.adress?.street
// nil
μμ μ½λ 맨 λ§μ§λ§ μ€μμ νλ‘νΌν°λ₯Ό ν΅ν΄ 체μΈμ²λΌ μ΄μ΄μ Έμλ μ΅μ λ 체μ΄λμ νμΈν μ μλ€.
μ΅μ λ 체μ΄λμ 보λ€μνΌ infoλΆν° μ°¨λ‘λλ‘ nilκ°μΈμ§ μλμ§λ₯Ό κ²μ¬νμ¬ κ²°κ³Όλ₯Ό λ°ννλ€.
nilμ΄ λ°νλ μλ μλ€λ μ μ κ³ λ €ν΄ νλ‘νΌν°λ§λ€ ?λ₯Ό λΆμ¬μ£Όμλ€.
λΉ λ₯Έ μ΄ν΄λ₯Ό μν΄ μλμ κ°λ¨ν μ μ½λμ μ΅μ λ 체μ΄λ μ§ν λ°©ν₯μ κ·Έλ Έλ€.
λ¨Όμ seolheeμ infoκ° nilμΈμ§ κ²μ¬νλλ°, νμ¬ info λ³μμλ μ무 κ°λ μ μ₯λμ§ μμκΈ° λλ¬Έμ
κ·Έ λ€λ₯Ό κ²μ¬ν νμ μμ΄ λ°λ‘ nilμ λ°ννλ λͺ¨μ΅μ λ³Ό μ μλ€.
π μ¬κΈ°μ μλ‘κ² μ μ μλ μ λ³΄κ° νλ μλ€.
λ°λ‘ κ°μ μΆμΆκ³Ό μ΅μ λ 체μ΄λμ μ°¨μ΄μ !
κ°μ μΆμΆμ nil κ°μ λ°νν μ μκΈ° λλ¬Έμ μμ μ½λλ₯Ό κ°μ μΆμΆλ‘ μ§ννλ€λ©΄ λΆλͺ μ€λ₯λ₯Ό λ§λ€μμ κ²μ΄λ€.
νμ§λ§ μ΅μ λ 체μ΄λμ λ°νμ μ΅μ λ κ°μΌλ‘ ν΄μ£ΌκΈ° λλ¬Έμ nil κ°μ΄ μ μ₯λμ΄μλλΌλ μΆμΆμ΄ κ°λ₯νλ€.π₯
λ€μ ν λ² μ΅μ λ 체μ΄λμ΄ μμ ν λ°©λ²μ΄λ κ²μ μ μ μλ λΆλΆμ΄λ€.
λμμμ, μμ μ΅μ λ 체μ΄λ μμ μ½λμ κ°μ ν λΉνμ¬ λ€μ ν λ² μ΅μ λ 체μ΄λμ ν΄λ³΄μ.
// μ΅μ
λ 체μ΄λμΌλ‘ κ° ν λΉ
seolhee.info = Info(phoneNum: 0000)
seolhee.info?.adress = Adress(city: "μΈμ²")
seolhee.info?.adress?.street = "κ³μꡬ"
// μ΅μ
λ 체μ΄λ
let seolheeInfo: String? = seolhee.info?.adress?.street
// "κ³μꡬ"
μμμ μμ±ν μ½λμ μ΄λ κ² κ°μ ν λΉν΄μ£Όκ³ λ€μ μ΅μ λ 체μ΄λμ ν΄μ£Όμλ€.
κ°μ λ€ ν λΉν΄ μ£ΌμκΈ°μ infoλΆν° μ°¨λ‘λλ‘ κ²μ¬νμ λ nil κ°μ΄ μμκ³ , streetμ μ μ₯λ κ°μ μ±κ³΅μ μΌλ‘ λ°ννλ€.
π κ·Έλ°λ° μμ μ½λμ μ£Όμμ νμΈνλ©΄ νΉμ΄ν μ μ λ°κ²¬ν μ μλ€.
μ΅μ λ 체μ΄λμ λ°λλ‘, κ°μ ν λΉλ κ°λ₯νλ€λ κ² !
λ¬Όλ‘ μ¬κΈ°μλ μΆμΆν λμ λ§μ°¬κ°μ§λ‘,
μ΄μ΄μ§λ λ€λ₯Έ νλ‘νΌν°λ€μ κ°μ΄ ν λΉλμ΄μμ§ μλ€λ©΄ μ΅μ λ 체μ΄λ λμμ μ€κ°μ μ€λ¨λλ€.
μ΄λ κ² μ΅μ λ 체μ΄λμ λν΄ μμλ΄€λλ°,
μ¬κΈ°μ ν κ°μ§ μΆκ°νκ³ μΆμ λ΄μ©μ΄ μλ€.
μ΅μ λ 체μ΄λμ μ΅μ λ λ°μΈλ©κ³Ό κ²°ν©ν μ μλ€λ κ².!!π₯
βοΈ μ΅μ λ 체μ΄λ + λ°μΈλ©
λ°λ‘ μ½λλ‘ νμΈν΄λ³΄μ.
let seolhee: Person = Person(name: "seolhee")
// μ΅μ
λ 체μ΄λμΌλ‘ κ° ν λΉ
seolhee.info = Info(phoneNum: 0000)
seolhee.info?.adress = Adress(city: "μΈμ²")
seolhee.info?.adress?.street = "κ³μꡬ"
// μ΅μ
λ λ°μΈλ©κ³Ό 체μ΄λμ κ²°ν©
if let information: String = seolhee.info?.adress?.street {
print(information)
}
else {
print("Can not find")
}
// "κ³μꡬ"
μμ μ½λλ₯Ό νμΈν΄λ³΄λ©΄ if letμ μ¬μ©νμκ³ , λ€μ μ΅μ λ 체μ΄λ ꡬ문μ λ£μ κ²μ νμΈν μ μλ€.
μ΄λ κ² μ΅μ λ λ°μΈλ©κ³Ό 체μ΄λμ ν¨κ» μ¬μ©νλ©΄,
λ°μΈλ©μ ν΅ν΄ seolhee.info.adress.streetμ κ²°κ΄κ°μ΄ nilμ΄ μλμ νμΈνλ λμμ
informationμ΄λΌλ μμλ‘ λ°μμ¬ μ μλ€.
π μ΅μ λ λ°μΈλ©μ μ΄λ κ² μ²΄μ΄λκ³Ό ν¨κ»μ°λ©΄ κ΅μ₯ν μ μ©νκ² μ¬μ©ν μ μλ€.
μ€λμ κ°μ μΆμΆ, μ΅μ λ λ°μΈλ©, μ΅μ λ 체μ΄λ. μ΄λ κ² λ€μν μ΅μ λ μΆμΆ λ°©λ²μ λν΄ μ 리νλ€.
κ°μ μΆμΆμ λ¬Έμ λ₯Ό νλ©΄μ λ§μ΄ μ¬μ©ν΄λ΄€λλ°, λ°μΈλ©κ³Ό 체μ΄λλ μ°μ΅μ΄ λ§μ΄ νμν κ² κ°λ€.
μ€μννΈλ₯Ό μ¬μ©νλ©΄μ νμμ μΈ λ΄μ©μ΄λ κΌ μ°μ΅ν΄μ λ΄κ²μ²λΌ μ¬μ©ν μ μκ² νμ !
π μ 리 π
μ΅μ λ μΆμΆμλ κ°μ μΆμΆ, μ΅μ λ λ°μΈλ©, 체μ΄λμ΄ μλλ°
κ°μ μΆμΆμ nilμΈμ§ νμΈνμ§ μκ³ λ°λ‘ μΆμΆνλ κ²μ΄κ³
λ°μΈλ©μ νμΈνκ³ μΆμΆ, κ·Έλ¦¬κ³ μ²΄μ΄λμ μ°μν΄μ νμΈνλ©° μΆμΆνλ λ°©μμ΄λ€.
κ°μ μΆμΆμ μ€λ₯ λ°μ κ°λ₯μ±μ΄ λμΌλ λ°μΈλ©κ³Ό 체μ΄λ μμ£Όλ‘ μ°μ΅νμ !
μ°Έκ³
- π μ€μννΈ νλ‘κ·Έλλ°
- π https://docs.swift.org/swift-book/LanguageGuide/OptionalChaining.html
'3οΈβ£ Swift > Swift μ 리' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] μΌκΈ κ°μ²΄ (First-class Citizen) μ 리 (2) | 2021.06.24 |
---|---|
[Swift] sorted, joined ν¨μ μ¬μ© μ μ£Όμ μ¬ν! (0) | 2021.06.13 |
[Swift] Type Annotationκ³Ό Type Inference (νμ μ΄λ Έν μ΄μ κ³Ό νμ μΆλ‘ ) (2) | 2021.06.11 |
[Swift] Int, Int64? (0) | 2021.06.09 |
[Swift] let ν€μλλ₯Ό μ¬μ©νλ μ΄μ (μμλ₯Ό μ¬μ©νλ μ΄μ ) (2) | 2021.06.09 |
λκΈ