μλ νμΈμ μ μΈμ λλ€ :)
TILμ μμ±νλ€κ° μ΅μ λμ λν΄ μ 리λ₯Ό νκ² λμλλ°μ,
κ·Έλ₯ μ΅μ λ λ½κ°κΈ°λ‘ μ λλ‘ μ 리λ₯Ό νμ μΆμ΄μ Optionalμ λν 곡μλ¬Έμμ κΉνλΈμ μ€νλ Optional λ΄λΆ ꡬ쑰 μ½λλ₯Ό ν λλ‘ μ΅μ λμ λν΄ μ 리λ₯Ό μ ν΄λ³΄λ € ν©λλ€!
Optional (μ΅μ λ)
μ΅μ
λμ κ°μ΄ 'μμ μλ, μμ μλ μμ' μ λνλ΄λ ννμ
λλ€.
μ΄λ 'λ³μλ μμ λ±μ κΌ κ°μ΄ μλ€λ κ²μ 보μ₯ν μ μμ΅λλ€. μ¦, λ³μ λλ μμμ κ°μ΄ nilμΌ μλ μλ€'λ κ²μ μλ―Έ
@frozen
enum Optional<Wrapped>: ExpressibleByNiliteral {
case none // nil
case some(Wrapped) // optional value
}
μ΅μ
λμ μ λ€λ¦μ΄ μ μ©λ μ΄κ±°ν νμ
μ
λλ€.
μ΄λ μ΅μ
λμ΄ κ°μ κ°λ μΌμ΄μ€μ κ·Έλ μ§ λͺ»ν μΌμ΄μ€ λ κ°μ§λ‘ μ μλμ΄ μμμ λ»ν©λλ€.
μ°Έκ³ ) @frozen(Declaration Attributes μ€ νλ)μ ꡬ쑰체(struct) λλ μ΄κ±°ν(enum) Declarationμ μ μ©νλ©΄ νμ λ³κ²½μ μ νν μ μλ€. enum νμ κ³ μ λλ―λ‘ switchλ¬Έ μΈ λ default μΌμ΄μ€κΉμ§ μ¨μ€ νμ μμ!
μ΅μ λμ μ¬μ©νλ μ΄μ
λͺ μμ νν
1. nilμ κ°λ₯μ±μ μ½λλ§μΌλ‘ ννκ°λ₯(μ§κ΄μ )
2. λ¬Έμ/μ£Όμ μμ± μκ° μ μ½
μμ ν μ¬μ©
1. μ λ¬λ°μ κ°μ΄ μ΅μ λμ΄ μλλΌλ©΄ nil 체ν¬λ₯Ό νμ§ μκ³ μ¬μ©κ°λ₯
2. μμΈ μν©μ μ΅μν νλ μμ ν μ½λ©
3. ν¨μ¨μ μ½λ©
Optional Unwrapping(μ΅μ λ μΆμΆ)
μ΅μ λ νμ μ κ°μ μΆμΆνλ λ°©λ²μ λν΄ μμλ΄ μλ€!
1. Optional Binding(μ΅μ λ λ°μΈλ©)
λ¨Όμ μ΅μ λ κ°μ nilμΈμ§ μλμ§ μ²΄ν¬(μ΅μ λ μμ κ°μ΄ λ€μ΄μλμ§ νμΈ)νκ³ , κ°μ΄ μμΌλ©΄ κ·Έ κ°μ κΊΌλ΄μ€λ μμ ν μΆμΆ λ°©λ²μ λλ€.
if let κ³Ό guard let ꡬ문μ μ΄μ©ν΄ μ΅μ λ λ°μΈλ©μΌλ‘ μμ νκ² μ΅μ λ κ°μ μΆμΆν μ μμ΅λλ€.
// if let ꡬ문 μ¬μ© μμ
if let starPath = imagePaths["star"] {
print("The star image is at '\(starPath)'")
} else {
print("Couldn't find the star image")
}
// guard let ꡬ문 μ¬μ© μμ
guard let starPath = imagePaths["star"] else {
print("Couldn't find the star image")
return
}
print("The star image is at '\(starPath)'")
if letκ³Ό guard letμ λν λ μμΈν μ€λͺ κ³Ό λ ꡬ문μ μ°¨μ΄μ μ λν΄μλ μλ κ²μκΈμ μ°Έκ³ ν΄μ£Όμλ©΄ μ’μ κ² κ°μ΅λλ€ :)
2. Optional Chaning(μ΅μ λ 체μ΄λ)
λνλ μΈμ€ν΄μ€μ νλ‘νΌν°μ λ©μλμ μμ νκ² μ‘μΈμ€νλ €λ©΄ ? μ°μ°μλ₯Ό μ΄μ©ν μ΅μ λ 체μ΄λλ₯Ό μ¬μ©ν μ μμ΅λλ€.
μ΅μ
λ 체μ΄λμ μ΅μ
λ λ΄λΆμ λ΄λΆμ λ΄λΆλ‘ μ€μ²©λμ΄ μ΅μ
λμ΄ μ°κ²°λμ΄ μμ λ μ μ©νκ² νμ©ν μ μμ΅λλ€.
λ§€λ² nil νμΈμ νμ§ μκ³ μ΅μ’
μ μΌλ‘ μνλ κ°μ΄ μλμ§ μλμ§ νμΈν μ μμ΅λλ€.
μ€μ²©λ μ΅μ
λ μ€ νλλΌλ κ°μ΄ μ‘΄μ¬νμ§ μλλ€λ©΄ κ²°κ³Όμ μΌλ‘ nilμ λ°νν©λλ€.
// μ¬λ ν΄λμ€
class Person {
var name: String
var job: String?
var home: Apartment?
init(name: String) {
self.name = name
}
}
// μ¬λμ΄ μ¬λ μ§ ν΄λμ€
class Apartment {
var buildingNumber: String
var roomNumber: String
var `guard`: Person?
var owner: Person?
init(dong: String, ho: String) {
buildingNumber = dong
roomNumber = ho
}
}
// μ΅μ
λ 체μ΄λ μ¬μ©
// μΈμ€ν΄μ€ μμ±
let jane: Person? = Person(name: "jane")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")
// μ΅μ
λ 체μ΄λμ μ¬μ©ν΄ νλ‘νΌν°μ μ κ·Ό
func guardJobWithOptionalChaining(owner: Person?) {
if let guardJob = owner?.home?.guard?.job {
print("μ°λ¦¬μ§ κ²½λΉμμ μ§μ
μ \(guardJob)μ
λλ€")
} else {
print("μ°λ¦¬μ§ κ²½λΉμμ μ§μ
μ΄ μμ΄μ")
}
}
guardJobWithOptionalChaining(owner: jane)
// μ°λ¦¬μ§ κ²½λΉμμ μ§μ
μ΄ μμ΄μ
3. Nil-Coalescing Operator(nil λ³ν© μ°μ°μ)
Optional μΈμ€ν΄μ€κ° nilμΌ κ²½μ° defaultκ°μ μ 곡νκΈ° μν΄ nil λ³ν© μ°μ°μ(??)λ₯Ό μ¬μ©ν©λλ€.
??μ μ¬μ©νμ¬ νννλ μ€μ μ°μ°μμ΄κΈ° λλ¬Έμ (Optional) ?? (Value) μ κ°μ΄ optional κ°κ³Ό value μ¬μ΄μ μμΉν©λλ€.
μ’μΈ‘μ μ΅μ
λ κ°μ΄ nilμΌ κ²½μ°, μ°μΈ‘μ κ°μ λ°νν©λλ€.
titleLabel.text = UserDefaults.standard.value(forKey: "nickname") ?? "μ¬μ©μ"
let input = readLine()
print("μ
λ ₯ κ°μ \(input ?? "") μ
λλ€")
4. Unconditional Unwrapping(μ΅μ λ κ°μ μΆμΆ)
μ΅μ λμ κ°μ΄ λ€μ΄μλμ§ μλμ§ νμΈνμ§ μκ³ κ°μ λ‘ κ°μ κΊΌλ΄λ λ°©μμ λλ€.
μ΅μ
λ μΈμ€ν΄μ€μ κ°μ΄ ν¬ν¨λμ΄ μλ€κ³ νμ νλ κ²½μ° κ°μ μΈλ© μ°μ°μ(!)λ₯Ό μ¬μ©νμ¬ λ¬΄μ‘°κ±΄ κ°μ μΈλνν μ μμ΅λλ€.
λ§μ½ κ°μ΄ μμκ²½μ°(nil) λ°νμ μ€λ₯κ° λ°μν©λλ€.
var myName: String? = jane
var youName: String! = nil
printName(myName!) // jane μΆλ ₯
myName = nil
print(myName!)
// κ°μ μΆμΆμ κ°μ΄ μμΌλ―λ‘ λ°νμ μ€λ₯ λ°μ
yourName = nil
printName(yourName)
// nil κ°μ΄ μ λ¬λκΈ° λλ¬Έμ λ°νμ μ€λ₯λ°μ
[μ°Έκ³ μλ£]
https://developer.apple.com/documentation/swift/optional
https://github.com/apple/swift/blob/main/stdlib/public/core/Optional.swift
'π iOS > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] Generic (2) | 2023.11.28 |
---|---|
[Swift] μ λ ¬ λ©μλ μ 볡νκΈ° (sort(), sorted()) (0) | 2023.10.23 |
[Swift] νλ‘νΌν°(Properties) - νμ νλ‘νΌν° (0) | 2023.04.02 |
[Swift] νλ‘νΌν°(Properties) - νλ‘νΌν° μ΅μ λ² (0) | 2023.04.02 |
[Swift] νλ‘νΌν°(Properties) - μ μ₯ νλ‘νΌν°, μ°μ° νλ‘νΌν° (2) | 2023.04.01 |