[ Swift κΈ°μ΄ λ¬Έλ² ] μ΅μ λ νμ (Optional Types) / Unwrapping / μ΅μ λ λ°μΈλ©(Optional Binding)
π¬
λ€λ₯Έ μΈμ΄μμλ μλ μλ‘μ΄ νμ μΌλ‘ νμ λ€μ λ¬Όμν(?)λ§ λΆμ¬ μ£Όλ©΄ λλ€.
μ± μλ μ λ©λͺ¨λ¦¬ 곡κ°μ κ°μ΄ μμΌλ©΄ μλ¬κ° λ°μνλ€.
μ΄λ μ±μ΄ κΊΌμ§κ² λλ―λ‘ λ§€μ° μνν μλ¬μ΄λ€.
ex)
λ€νΈμν¬μμ κ°μ Έ μ¨ κ°μΌλ‘ μ΄κΈ°ν νλ€κ³ νλ©΄ μ μμ΄ λμ΄ μμ§ μκ±°λ
μ€κ°μ μ°κ²°μ΄ λ겨 λ²λ¦¬λ©΄ κ°μ μ μ₯ν μ μκ² λλ€.
μ΄λ° κ²½μ° κ°μ΄ μ μ₯λμ΄ μμ§ μλλ° λμ΅μ λ νμ μ κ°μ λ°λμ κ°μ§κ³ μμ΄μΌ νλλ°
μκΈ° λλ¬Έμ μλ¬κ° λ°μνκ² λλ€.
λ°λΌμ λ³μμ μμλ κ°μ μ½κΈ° μ μ λ°λμ μ΄κΈ°ν ν΄μΌ νλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ μλ¬κ° λ°μνμ§ μλλ‘ μμμ μΈ νμ μ
λ©λͺ¨λ¦¬ 곡κ°μ λ΄μλλ κ°λ μ΄ μ΅μ λ νμ μ΄λ€.
νμ νμ μ λ§λ κ°μ κ°μ§κ³ μμ΄μΌ νλ€.
-> λμ΅μ λ νμ (Non- optional Type)
* μ΅μ λ νμ μ΄ λμ΅μ λ νμ λ³΄λ€ λ λμ λ²μμ ν΄λΉλλ€.
λμ΅μ λ νμ μ ?λ₯Ό λΆμ΄λ©΄ μ΅μ λ νμ μ΄ λλ€.
var num1: Int? = 3 //κ°νΈ λ¬Έλ²
var num2: optional<Int> = 5 //μ κ· λ¬Έλ²
var num3 = nil //μλͺ»λ λ¬Έλ² - νμ
μΆλ‘ μ΄ λΆκ°λ₯νκΈ° λλ¬Έμ κΌ μ νν νμ
λͺ
μ
print(num1) // μΆλ ₯κ° : optional(3)
//================================
var name: String?
//name = "jihyeon"
print(name) // μΆλ ₯κ° : nil <- μλμΌλ‘ nilλ‘ μ΄κΈ°νλ¨
: μ μ + nil(μμμ μΈ νμ , κ°μ΄ μμμ μλ €μ£Όλ μμμ μΈ νν)
μ΅μ λμ κ°μ΄ μμ μλ μλ κ²½μ°μΈ nilμ΄ ν¬ν¨λ νμ μ΄λ€.
κ°μ΄ μμΌλ©΄ μλμΌλ‘ nilμ΄λΌλ μμμ μΈ νμ μΌλ‘ μ΄κΈ°νκ° λκΈ° λλ¬Έμ
λ©λͺ¨λ¦¬μ μ κ·Όν΄λ μλ¬κ° λ°μνμ§ μλλ€.
* λ€λ₯Έ μΈμ΄μμμ nullμ μ€μ λ‘ κ°μ΄ μμμ μλ―Ένλ μ°¨μ΄μ μ΄ μλ€.
* Int(μ μν)μλ μ ν λ€λ₯Έ νμ μ΄λ€.
var num1: Int? = nil
num = 10
print(num1) // Optional(10) : μ΅μ
λ νμ
print(num1) // 10 : λμ΅μ
λ νμ
var num2: Int? = 5
print(num1+num2) // μ€λ₯ : μ΅μ
λ νμ
λΌλ¦¬μ μ°μ°μ λΆκ°
//======================================
let num1: Int? = nil // μ€λ₯ : μ΅μ
λ νμ
μ νμ varλ‘ μ μΈνλ€.
// nilμ κ°μ΄ μμ μλ μλ κ°μ΄λ―λ‘ κ°μ΄ λ³ν μλ μμ΄μΌ νκΈ° λλ¬Έ!!
: κ°μ μΆμΆνλ€. λ¨, nilμ΄ μλ κ²½μ°μλ§ λ²κΈΈ μ μλ€.
μ΅μ λμ νΉλ³ν λ°©μμΌλ‘ κ°μ μ μ₯νκ³ μκΈ° λλ¬Έμ
κ°μ μ¬μ©νλ €λ©΄ κ°μ κΊΌλ΄μΌνλλ° μ΄λ° μμ μ μΈλ©νμ΄λΌκ³ νλ€.
μ΄λ, μΆμΆλ κ°μ νμ μ λμ΅μ λ νμ μ΄ λλ€.
μλλ κ°μ μΆμΆνλ λ°©μμ΄λ€.
: μ΅μ λ ννμμ !λ§ λΆμ΄λ©΄ λλ€.
// κ°μ μΆμΆ : κ°μ΄ μλ κ²μ΄ νμ€ν λ μ¬μ©
var num1: Int? = 10
var num2: Int?
print(num1!) // μΆλ ₯ : 10
print(num2!) // μλ¬ λ°μ -> κ°μ΄ μ€μ λ‘ μλλ° κ°μ λ‘ μΆμΆνκΈ° λλ¬Έ
π κ°μ΄ μλ κ²½μ° κ°μ μΆμΆμ νκ² λλ©΄ fatal errorκ° λ°μν μ μλ€.
μ΄λ μ±μ΄ λ°λ‘ κΊΌμ§κ² λλ―λ‘ νμν κ²½μ°μλ§ μ νμ μΌλ‘ μ¬μ©νλ κ²μ΄ μ’λ€.
κ°μ μΆμΆμ μμ νκ² μ¬μ©νλ €λ©΄ κ°μ κΊΌλ΄κΈ° μ μ κ°μ΄ μλμ§ νμΈνλ κ²μ΄ μ€μνλ€.
var num: Int? // nil
// ifλ¬ΈμΌλ‘ κ°μ΄ μλμ§ νμΈ ν μΆμΆ
if num != nil {
print(num) // μΆλ ₯ μλ¨
}
: κ°μ μΆμΆ 보λ€λ μ΅μ λ λ°μΈλ©μ μ¬μ©ν΄ κ°μ μμ νκ² μΆμΆνλ€.
λ©λͺ¨λ¦¬ 곡κ°μ μλ μ΅μ λ κ°μ΄ μμμ λ΄κΈ΄λ€λ©΄(nil κ°μ΄ μλλΌλ©΄) μ½λ λ΄λΆ μ€ννλ€
var num1: Int? // nil
var num2: Int? = 10 // optional(10)
// if let λ°μΈλ© ==============================
if let n1 = num1 { // μμμ λ΄κΈ΄λ€λ©΄ == nilμ΄ μλλ€
print(n1) // μΆλ ₯ μλ¨
}
if let n2 = num2 {
print(n2) // μΆλ ₯ : 10
}
// guard let λ°μΈλ© ==============================
func sayHello(name: String?) { // κ°μ΄ μμ μλ μμ μλ μμ
guard let n = name else {return} // κ°μ΄ μλ κ²½μ°μλ§ μμ nμ λ΄κΈ°κ³ μλ μ½λ μ€ν
print(n) // μ΄λ nμ optional("hi") νμ
μ΄ nμμ λ²κ²¨μ μ λ΄κΈ΄λ€λ©΄
}
sayHello("hi") // μΆλ ₯ : hi
μ΅μ λ ννμμ νκ°νλλ° κ°μ΄ μ μ₯λμ΄ μλ€λ©΄ κ°μ μΈλνν΄μ μμμ μ μ₯νλ€. μ΄ μνκ° λ°μΈλ©μ΄ μ±κ³΅ν κ².
λ°λλ‘, κ°μ΄ μλ€λ©΄(nilμ΄ μ μ₯λμ΄ μλ€λ©΄) λ°μΈλ©μ μ€ν¨ν κ².
μ΄λ ifλ¬Έκ³Ό whileλ¬Έμ λ€μ λ¬Έμ₯μΌλ‘ μ μ΄λ₯Ό λκΈ°κ³ guardλ¬Έμμλ else λΈλ‘μ΄ μ€νλκ³ μ€μ½νκ° κ±°κΈ°μ λλλ€.
μ΅μ λ ννμμ κ°μ΄ μ μ₯λμ΄ μμ λλ§ μΈλ©ν νκΈ° λλ¬Έμ κ°μ μΆμΆ ν λ λ°μνλ μλ¬κ° λ°μνμ§ μλλ€.
μ½λμμ λ°μν μ μλ μ΅μ λ μλ¬λ₯Ό νΌν μ μλ€.
if / while λ¬Έμμ μ΅μ λ λ°μΈλ©μΌλ‘ μ μΈν μμλ λ°λ‘ μ΄μ΄μ§λ λ‘컬 μ€μ½νμμλ§ μ¬μ©μ΄ κ°λ₯νλ€.
μ΅μ λ νμ ??(λ¬Όμν2κ°) λ€μ μ΅μ λ κ°μ΄ nilμΌ κ²½μ° κΈ°λ³Έκ°μΌλ‘ μ¬μ©λ κ°μ μ λλ€.
μ΄λ ν κ²½μ°μλ κ°μ΄ μλ κ²½μ°κ° μλ€.
κΈ°λ³Έ κ°μ μ μν μ μμ λ μ¬μ©νλ€.
μΆμΆ ν μλ‘μ΄ λ³μμ λ΄κΈ°λ©΄ λμ΅μ λ νμ μΌλ‘ λ΄κΈ΄λ€.
μΌν, μΌνμ°μ°μ λΉμ·νλ° μ€μ λ‘λ μΌνμ°μ°μλ‘λ μ¬μ©ν μ μλ€.
var str:String? = "jihyeon"
print(str ?? "hello") // μΆλ ₯ : jihyeon
str = nil
print(str ?? "hello") // μΆλ ₯ : hello
- https://www.youtube.com/watch?v=UwHB4sM5tJA
[ Swift κΈ°μ΄ λ¬Έλ² ] νν(Tuple) (0) | 2024.05.11 |
---|---|
[ Swift κΈ°μ΄ λ¬Έλ² ] μ°μ°μ(Operator) (0) | 2024.05.09 |
[ Swift κΈ°μ΄ λ¬Έλ² ] μ μ΄ μ λ¬λ¬Έ - break, continue, return, fallthrough / throw (0) | 2024.05.02 |
[ Swift κΈ°μ΄ λ¬Έλ² ] 쑰건문 - if ꡬ문 / guard ꡬ문 / switch ꡬ문 (0) | 2024.05.02 |
[ Swift κΈ°μ΄ λ¬Έλ² ] λ°λ³΅λ¬Έ - forλ¬Έ, whileλ¬Έ (0) | 2024.04.29 |