π₯ μ΅μλ(Optional)
@frozen
enum Optional<Wrapped>
- nilμ μ¬μ©ν μ μλ νμ κ³Ό κ·Έλ μ§ λͺ»ν νμ μ ꡬλΆνκΈ° μν μλ¨μ΄λ€.
- nilμ μ¬μ©ν μ μλ νμ μ Optional Typeμ΄λΌκ³ νλ€.
- Optional Typeμ νμ μμ ?λ₯Ό λΆνλ€.
- enum νμ μ΄λ©°, caseλ‘λ Optional.some(Wrapped) κ³Ό Optional.none κ° μλ€.
→ μ¦, μλ¬κ° λ¬μ§λ§ λ°λ‘ μ±μ μ€λ¨μν€λ κ²μ΄ μλ, nilμ λ΄ λ±μκ±°λ€.(κΈ°νλ₯Ό νλ² λ μ£Όλ κ²!)
- μ΄λ ν μν©μμ νμν μ§ μλ₯Ό ν΅ν΄μ μμ보μ. μλμ κ°μ κ²½μ°λ μ°λ¦¬κ° μμνλλλ‘μ΄λ€.
let people = ["kim": 1, "lim": 2, "hyun": 3]
let name = people["kim"] // 1
- κ·Έλ¬λ, λ§μ½μ μλμ κ°μ΄ μ κ·Όμ νλ€λ©΄ μλ¬κ° λμμΌλλ€.(Optionalμ΄ μλλΌλ©΄) μ΄λ¬ν κ²½μ°, optionalμ νμ©νμ¬ errorλ₯Ό λ°λ‘ λμ§λ κ² μλλΌ nilμ λμ Έ νλ‘κ·Έλ¨μ κ°μ μ’ λ£λ₯Ό λ§λ κ²μ΄λ€!
let name = people["brrr"] // nil
- return κ°μ΄ optionalμ΄λ€!
π Optionalμ μ μΈνλ λ°©λ²
𫧠Type anootation νμ©
- μλμ κ°μ΄ ?μ ν΅νμ¬ optionalμ μ μΈν μ μλ€.
var people: String?
people = nil // μλ¬κ° μκΈ°μ§ μλλ€.
// λ§μ½
var peopel: String
people = nil // error
𫧠Type inference νμ©
- μ μΈκ³Ό λμμ κ°μ μ΄κΈ°ν ν΄μ£Όλ©΄ λλ€.
let number: Int? = nil
let number2 = number
// number2λ μ΅μ
λ νμ
μ΄ λλ€.
- μλμ κ°μ΄ numberλ Optional(4)μ΄λ€. μ΄κ±Έ λ²κ²¨μ£Όλ λ°©λ²μ μμ보μ.
let number: Int? = nil
print(type(of: number)) // Optional<Int>
number = 4
print(number) // Optional(4)
π Optional Unwrapping
- Optionalμ λμ£Όλ λ°©λ²μ΄λ€
- Unwrapping νκ³ μνλ λ³μλ μμκ° nilμ΄λ©΄ μλλ€.
- Optionalμ μ‘΄μ¬νμ§ μλλ€. nilμ μ΄λ ν κ°μ΄ μλλ€! κ·Έλ₯ κ°μ΄ μλ κ²μ΄λ€.
- μ¦, nilμ unwrapping ν μ μλ€. λ§μ½ νλ €κ³ νλ©΄ μλ¬κ° λλ€!
𫧠1. Forced Unwrapping
- μ΅μ λμ κ°μ΄ nilμ΄κ±΄ λ§κ±΄ κ·Έλ₯ κ°μ λ‘ μ΅μ λμ λμ΄λ²λ¦¬λ κ²μ΄λ€.
let number: Int? = nil
print(a!) // error
𫧠2. Optional Binding
- μλμ κ°μ λ‘μ§λ₯Ό ν΅ν΄μ μ΅μ
λμ λμ€λ€.
- λ§μ½ nilμ΄ μλλΌλ©΄ μμμ μ΅μ λμ΄ ν΄μ κ° λ κ°μ μ μ₯νκ³ , trueλ₯Ό returnνλ€.
- λ§μ½ nilμ΄λΌλ©΄ falseλ₯Ό return νλ€.
π« if let
- μλμ κ°μ λ°©μμ ν΅νμ¬ optional bindingμ μ§ννλ€.
let optionalNum: Int? = 10
if let num = optionalNum { print("num") } else { print("optionalNum") }
// 10
- λ§μ½μ nilμ΄ μ μ₯λμ΄μμλ€λ©΄? nilμ νλ¦°νΈνλ€.
let optionalNum: Int? = nil
if let num = optionalNum { print("num") } else { print("optionalNum") }
// nil
π« guard let
- μλμ κ°μ λ°©μμ ν΅νμ¬ Optional Bindingμ νλ€.
let optionalNum: Int? = 10
guard let num = optionalNum else { print("optionalNum") }
// 10
π« if let VS guard let
- π if let
- λ¨Όμ λ°μΈλ©λ μμμ scopeκ° μλ‘ λ€λ₯΄λ€.
- μλμ κ°μ΄ ifλ¬Έμμ μ μλ numμ ifλ¬Έ μμμλ§ μ¬μ©μ΄ κ°λ₯νλ€.(else λ¬Έ μμμλ μ¬μ©μ΄ μλλ€) ⇒ μ§μ λ³μμ μ±κ²©
- λ¨μν optional μ²λ¦¬λ§ νκ³ νΌλλ°±μ μ£Όκ³ μΆμ λ!
let optionalNum: Int? = 10
if let num = optionalNum { print("num") } else { print("optionalNum") }
print(num) // error
- π guard let
- κ·Έλ¬λ, guard λ¬Έμ κ²½μ° guard λ¬Έ λ°μμλ μ¬μ©μ΄ κ°λ₯νλ€.(else λ¬Έμμλ μλλ€) ⇒ μ μ λ³μμ μ±κ²©
- μ΅μ λ μ²λ¦¬ κ°μ΄ nilμΌ κ²½μ° λ¬΄μ‘°κ±΄ ν¨μμ μ€νμ μ’ λ£μν€κ³ μΆμ λ!
let optionalNum: Int? = 10
guard let num = optionalNum else { return }
print(num) // 10
π IUO(Implicitly unwrapped optional) - μ΅μ λ 묡μμ μΆμΆ
- μΌλ¨ μμλΆν° λ΄λ³΄μ! μλλ IUOμ΄λ€. μ΄κ²λ (κ°μ μΆμΆμ νλ)Optional typeμ΄λ€.
- κ·Έλ¬λ, non-optional typeμΌλ‘ μ²λ¦¬κ° λμ΄μΌν κ²½μ° κ°μ μλμΌλ‘ λ½μλ΄μ€λ€.
- μ¦, optional typeμ non-optional typeμ λμ μ΄ λ κ²½μ°, λ³λμ μΆμΆ κ³Όμ μ΄ μμ΄ λμ μ΄ κ°λ₯νλ€.
let name: String! // IUO
- μμ 맨 λ§μ§λ§ μ€μ μ£Όλͺ©ν΄λ³΄μ
optional typeμ non-optional typeμ λμ μ΄ λ κ²½μ°, λ³λμ μΆμΆ κ³Όμ μ΄ μμ΄ λμ μ΄ κ°λ₯νλ€.
- μ°λ¦¬κ° μκ³ μλ Optional Typeμ μλμ κ°λ€. Optional unwrapping μμ΄ λμ μ νκΈ°μ errorκ° λλ€.
var name: String? = "Miro"
var name2: String = name // error
- κ·Έλ¬λ, IUOλ₯Ό μ¬μ©ν κ²½μ° μλμ κ°μ μ½λκ° κ°λ₯ν΄μ§λ€. κ·Έλ¦¬κ³ name2λ nonOptional typeμΈ λ³μκ° λλ€!
var name: String! = "Miro" // μμ§, Optional<String>μ΄λ€
var name2: String = name // OK
π μ΅μ λ 체μ΄λ(Optional Chaining)
- μ΅μ λμ μ°μμ μΌλ‘ μ¬μ©νλ κ²μ΄λ€!
- .(μ )μ ν΅νμ¬ λ©μλλ νλ‘νΌν°μ μ κ·Όμ μ°μμ μΌλ‘ ν λ, μ΅μ λ κ°μ΄ νλλΌλ μλ€λ©΄, μ΅μ λ 체μ΄λμ΄λ€.
- μλμ λ κ°μ μ λͺ¨λ μ΅μ λ 체μ΄λμ΄λ€.
human.gender?.bloodType
human?.gender?.bloodType
- μλ₯Ό ν΅νμ¬ μ΅μ λ 체μ΄λμ μ΄ν΄ν΄λ³΄μ. λ structλ₯Ό λ¨Όμ μ μν΄λ³΄μ.
struct Genders {
var bloodType: String
var height: Int
}
struct Human {
var name: String
var gender: Genders
init(name: String, bloodType: String, height: Int) {
self.name = name
gender = Genders(bloodType: bloodType, height: height)
}
}
- κ·Έλ¦¬κ³ optionalν Human κ°μ²΄λ₯Ό νλ λ§λ€μ΄λ³΄μ
var miro: Human? = Human(name: "Miro", bloodType: "A", height: 185)
- κ·Έλ¦¬κ³ miroμ heightμ μ κ·Όν΄λ³΄μ! κ·Έλ¬λ©΄ μλ¬κ° λλ€. μ΄λ miroκ° μ΅μ λ νμ μ΄κΈ° λλ¬Έμ΄λ€.
miro.gender.height // error
- λ°λΌμ μλμ κ°μ΄ μ κ·Όμ ν΄μΌλλ€. κ·Έλ¦¬κ³ λ§μ½ miroκ° nilμ΄λΌλ©΄ nilμ΄ λ°νμ΄λλ€.
miro?.gender.height // 185
𫧠μ΅μ λ 체μ΄λμ λͺκ°μ§μ νΉμ§(by.μλ€λ)
- μ΅μ λ 체μ΄λμ κ²°κ³Όκ°μ νμ μ λ§μ§λ§ ννμμ μ΅μ λ νμ μ΄λ€.
miro = nil
let height = miro?.gender.height // nilμ΄μ§λ§, heightμ νμ
μ Optional<Int>type
- μ΅μ λ 체μ΄λμ λ§μ§λ§ ννμμ μ΅μ λμ΄λλΌλ ?λ₯Ό μλ΅νλ€!
struct Genders {
var bloodType: String
var height: Int?
}
let height = miro?.gender.height? // error
let height = miro?.gender.height // OK
- μ΅μ λ 체μ΄λμ ννμ μ€ νλλΌλ nilμ΄λΌλ©΄, λλ¨Έμ§ ννμμ νκ°νμ§λ μκ³ κ·Έλ₯ nilμ returnνλ€.
- ν¨μκ° κ»΄μλ μ΅μ
λ 체μ΄λμ κ²½μ°.
- ν¨μμ 리ν΄κ°μ΄ optionalμΈ κ²½μ°, ()?λ₯Ό λΆνμ€λ€!
struct Human {
var name: String
var gender: Genders
init(name: String, bloodType: String, height: Int) {
self.name = name
gender = Genders(bloodType: bloodType, height: height)
}
func getGenders() -> Genders? {
return gender
}
}
miro?.getGenders()?.height // 185
- λ§μ½ ν¨μ μμ²΄κ° μ΅μ λμ΄λΌλ©΄? ?()λ₯Ό ν΅νμ¬ μ κ·Όμ νλ€. ( return κ°μ μ΅μ λ μλ!)
struct Human {
var name: String
var gender: Genders
init(name: String, bloodType: String, height: Int) {
self.name = name
gender = Genders(bloodType: bloodType, height: height)
}
func getGenders() -> Genders { // return κ° μ΅μ
λ μλ
return gender
}
}
let function = miro?.getGenders()
function?().height // OK
- λ§μ½ ν¨μ μ체λ μ΅μ λμ΄κ³ , λ¦¬ν΄ κ°λ μ΅μ λμΌ κ²½μ°μλ ?()? λ₯Ό ν΅νμ¬ μ κ·Όν΄μ€λ€.
struct Human {
var name: String
var gender: Genders
init(name: String, bloodType: String, height: Int) {
self.name = name
gender = Genders(bloodType: bloodType, height: height)
}
func getGenders() -> Genders? {
return gender
}
}
let function = miro?.getGenders()
function?()?.height // OK
π μ°Έκ³ μλ£
Swift) Optional λΆμκΈ° (3) Optional Unwrapping - μ΅μ λ λ°μΈλ©(if let vs guard let)
Swift) Optional λΆμκΈ° (4) Optional Unwrapping - IUO (μ΅μ λ 묡μμ μΆμΆ)
'Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] first λ¬Έ (0) | 2023.02.04 |
---|---|
[Swift] λ°°μ΄ μμ νκ² μ‘°ννκΈ° (0) | 2023.02.04 |
[Swift] λ©ννμ (0) | 2023.02.03 |
[Swift] Generic (0) | 2023.02.03 |
[Swift] map μΌνμ (map, compactMap, flatMap) (0) | 2023.02.03 |