κ°μ΄ μμμ ν¬ν¨νλ μ΅μ λμ κ°λ μ λν΄ νμ΅ν λ΄μ©μ μ 리ν΄λ³΄κ³ μ νλ€.
βοΈμ΅μ λ
Swiftμμλ λ³μλ₯Ό μ μ₯νλ 곡κ°μ λ°μ€λ₯Ό μμλλλ€!
μ§μ§ λ°μ€λ μλκ³ μ€λ λ°°μΈ μ΅μ λμ λν λΉμ λ₯Ό λ€μ΄λ³Έκ±΄λ°
λΉ κ°μ μ»΄ν¨ν°μκ²λ μμ΄μΌ ν κ²μ΄ μλ€! π¨λ λλμ΄κΈ° λλ¬Έμ μλ¬λ₯Ό λ°μμν€κ³ μ΄ν리μΌμ΄μ μ μ’ λ£μν€κΈ°λ νλ€.
λλ¬Έμ μ΄λ κ² λͺ¨λ λ³μμ λ°μ€λ₯Ό μμλκ³ μ μ₯μ νλ©΄ κ°μ΄ μμ λμ μμ λ λͺ¨λ μμ νκ² μ»΄ν¨ν°κ° κ°μ μ½μ μ μλ€ π
- κ°μ΄ μμ μ μλ μν©μμ μ΅μ λ(Optional)μ μ¬μ©ν©λλ€.
- μ΅μ λμ λ¬Όμν ? λ‘ λνλ λλ€. (νμ μ΄λ Έν μ΄μ )
- μ΅μ
λμ λ κ°μ§ κ°λ₯μ±μ λνλ
λλ€.
- κ°μ΄ μκ³ μ΅μ λλ‘ λν(wrapping)ν΄λμ κ°μ μΈλν(unwrapping)νμ¬ ν΄λΉ κ°μ μ‘μΈμ€ν μ μλ€.
- κ°μ΄ μ ν μλ€.
- μ΅μ λ νμ λΌλ¦¬μ μ°μ°μ λΆκ°λ₯
- μμ μ½λ
// μΆμ½ νμ
νν
var serverResponseCode: Int? = 404
// μ μ νμ
νν
var myPetName: Optional<String> = "λ©λ©μ΄"
func pay(with card: String?) {
// ꡬν μ½λ
}
// μ΅μ
λ νμ
λΌλ¦¬μ μ°μ°μ λΆκ°λ₯
var num1: Int? = 4
var num2: Int? = 2
num1 + num2 // μλ¬ λ°μ!
let optionalString1: String? = "Hello, "
let optionalString2: String? = "world!"
// μ΅μ
λ String κ°λ€μ μ°κ²°νλ €λ μλ
let result = optionalString1 + optionalString2 // μλ¬ λ°μ!
μ΅μ λμ ꡬ쑰
(μ°Έκ³ ) optionalμ λ΄λΆμ μΌλ‘ enumμ ꡬ쑰λ₯Ό κ°μ§λ©° nilμ κ°μ§λ noneκ³Ό μ€μ κ°μ κ°λ someμΌλ‘ ꡬμ±λμ΄ μλ€.
βοΈ nil ν λΉ
- λ³μμ nilμ ν λΉν¨μΌλ‘μ¨ κ°μ΄ μλ μνμ μ΅μ λ νλ‘νΌν°λ₯Ό λ§λ€ μ μλ€.
- μμ μ½λ
var serverResponseCode: Int? = 404
serverResponseCode = nil
var surveyAnswer: String?
// surveyAnswer λ μλμΌλ‘ nil λ‘ μ€μ λλ€.
μ΅μ λ κ°μ nil ν λΉ κ°λ₯νλ©° κ°μ μ λ£μΌλ©΄ μλμΌλ‘ nil μ€μ λλ€!
βοΈ μ΅μ λ λ°μΈλ©
- μ΅μ λνκ² μ μΈν νμ μ μ΅μ λμ λ²κΈ°λ κ³Όμ ex) - Int? → Int, String? → String
- μ΅μ λ λ°μΈλ©μ μ΅μ λ κ°μ΄ λΉκ°μΈμ§ μ‘΄μ¬νλμ§ κ²μ¬ν ν, μ‘΄μ¬νλ κ²½μ° κ·Έ κ°μ λ€λ₯Έ λ³μμ λμ μμΌ λ°μΈλ©νλ κ²μ μλ―Έ
- μ΄λ κ² λΉ κ°μ 체ν¬νκ³ μ΅μ λ κ°μ μΈλν ν΄μ£Όλ κ²μ κ°μ λ‘ μΈλννλ κ²λ³΄λ€ ν¨μ¬ μμ νλ€.
- if let/if var, guard let/guard varμ μ¨μ μ΅μ λ κ°μ μΆμΆν΄ μλ‘μ΄ λ³μμ λ°μΈλ©νλ€.
- if let vs guard let μ°¨μ΄μ
- if letμ ifλ¬Έμ μ½λ ꡬνλΆ λ΄μμλ§ μμ μ¬μ©μ΄ κ°λ₯(μ§μ λ³μ)
- guard let μ guardλ¬Έμ ν΅κ³Όν μμλ₯Ό guardλ¬Έ λ°μμ μ¬μ©μ΄ κ°λ₯(μ μλ³μ)
- μμ μ½λ
if let/ if var: { } μμμ μ¬μ©ν λ³μλ₯Ό μ μνκ³ nilμ΄ μλ κ²½μ°μλ§ λΈλ‘ λ΄λΆμμ λ³μμ μ κ·Όμ΄ κ°λ₯νλ€.
if let <#μμ μ΄λ¦#> = <#μ΅μ
λ κ°#> {
// ꡬν μ½λ
// μ΅μ
λ κ°μ λ³μμ λ΄λλ€!! λ΄κΈ΄λ€λ©΄ true, λ΄κΈ°μ§ λͺ»νλ€λ©΄ false
}
let roommateNumbers: Int? = nil
if let roommates = roommateNumbers {
// roommateNumbersμ roommatesμ λ΄λλ€.
print (roommates)// κ°μ΄ μμ΄ μ½λ μ€ν x
}
// μΆλ ₯κ° μμ
let ticketCounts: Int? = 3
if let ticket = ticketCounts {
// ticketμ 3μ΄ λ΄κΈ΄λ€. true μνμ΄κΈ° λλ¬Έμ μΆλ ₯λ¨
print (ticket)
}
// μΆλ ₯κ°: 3
// μ΅μ
λ λ°μΈλ© ν λ³μκ° μ¬λ¬ κ°μΈ κ²½μ°
let boyName : String?
let girlName : String?
// νμ
λ§ μ μΈ -> μλμΌλ‘ nil ν λΉλ μν
// μ¬ν λΉ ν΄μ€
boyName = "νλ"
girlName = "λμ°"
// , μ½€λ§λ‘ λμ΄ν©λλ€
if let boy = boyName,
let girl = girlName {
print(boy, girl)
}
// μΆλ ₯κ°: νλ λμ°
// λ λ€ κ°μ΄ μλ μνλΌ μΆλ ₯ μ±κ³΅
guard let / guard var: μ μΈλ μ΄νμ λΈλ‘ λ°μμλ μ΅μ
λμ λ²κΈ°κ³ μ¬μ©μ΄ κ°λ₯νλλ‘ νλ€. λ¨, elseλ¬Έκ³Ό returnμ΄ νμμ΄κΈ° λλ¬Έμ μΈλνμ μ€ν¨νκ² λλ©΄ ν¨μλ₯Ό μ‘°κΈ°μ μ’
λ£νκ² λλ€.
{ } λ°μμ μ¬μ©μ΄ κ°λ₯νλ€.
let x : Int? = 10
let y : Int? = nil
func opbinding() {
guard let x = x else { return }
// μ’ x : λ§λ€μ΄μ€ λ³μ/μμ, μ° x : μ μΈλ λ³μ/μμ
print(x)
guard let y = y else { return } // yλ nil μ΄λ―λ‘ μ¬κΈ°μ return
print(y) // μμμ return νμκΈ° λλ¬Έμ μ΄ μ½λ λΌμΈμ μ€νλμ§ μμ
}
opbinding()
// μΆλ ₯κ°: 10
βοΈ μ΅μ λ κ°μ μΈλν
- κ°μ μΈλν(Force unwrapping)μ !λ₯Ό μ¨μ κ°μ λ‘ μ΅μ λ μΆμΆνλ€.(λ³μ μμ !λ₯Ό λΆμ΄λ κ²μ notμ μλ―Έ - ν·κ°λ¦¬μ§ λ§κ²!)
- κ°μ μΈλνμ μλͺ» μ¬μ©ν κ²½μ° νλ‘κ·Έλ¨μ΄ λΉμ μμ μΌλ‘ μ’ λ£λ μλ μμΌλ―λ‘ λ°λμ nilμ΄ μλ κ²μ΄ νμ€ν μν©μμ μ¬μ©ν΄μΌνλ€.(μ΅λν μμ°λκ² μ’μ)
- μ½λ μμ
let number = Int("42")!
// Stringκ°μ Intλ‘ λ³ννλ ν¨μλ returnκ°μΌλ‘ μ΅μ
λ κ°μ λ°ννλ€.
print(number)
// μΆλ ₯κ°: 42
// κ°μ μΈλνμ΄ μ€ν¨ν κ²½μ°
let address: String? = nil
print(address!)
// μλ¬π¨ λ©μμ§: Unexpectedly found nil while unwrapping an Optional value
βοΈ μ΅μ λ λ³μμ κ°μ΄ nilμΌ λλ₯Ό μν΄ κΈ°λ³Έκ° μ€μ νκΈ°
- κ°μ΄ nilμΌ κ²½μ°λ₯Ό μν΄ κΈ°λ³Έκ°μ μ€μ ν μ μλ€.(nil-coalescing)
- ?? μ μ¬μ©νμ¬ κΈ°λ³Έκ°μ μ¬μ©ν μ μλλ°, ?? μ΄ μ¬μ©νμ¬ κΈ°λ³Έκ°μ λΆμ¬ν λ³μλ μ΅μ λ νμ μ΄ μλλ€.
- let(var) a = b ?? c ννλ‘ μ΄λ£¨μ΄μ§λλ° bλ μ΅μ λ νμ μ΄κ³ , bκ° nilμΌ κ²½μ°λ aμ cκ° λμ λκ³ , nilμ΄ μλ κ²½μ°μλ μ΅μ λμ μ κ±°ν κ°μ΄ aμ λμ λλ€.
var optNumber: Int? = 3
let number = optNumber ?? 5
print(number) // μΆλ ₯κ° : 3
//numberλ Int? νμ
μ΄ μλλΌ Int νμ
// μ΅μ
λμ μ κ±°νλ €λ νμμ΄κΈ° λλ¬Έμ Int νμ
μ΄λ€!
optNumber = nil
let number2 = optNumber ?? 5
print(number) // μΆλ ₯κ° : 5
//numberλ Int? νμ
μ΄ μλλΌ Int νμ
βοΈ μ΅μ λ 체μ΄λ
- μ΅μ λμ μ°μμ μΌλ‘ μ¬μ©νλ κ²μ μ΅μ λ 체μ΄λμ΄λΌκ³ νλ€.
- .(μ ) μ ν΅ν΄ λ΄λΆ νλ‘νΌν°λ λ©μλμ μ°μμ μΌλ‘ μ κ·Όν λ μ΅μ λ κ°μ΄ μμΌλ©΄ μ΅μ λ 체μ΄λμΌλ‘ μ κ·Όν μ μλ€.
- μμ μ½λ
struct Person {
var name: String
var address: Address
}
struct Address {
var city: String
var street: String
var detail: String
}
let sam: Person? = Person(name: "Sam", address: Address(city: "μμΈ", street: "μ λ
Όνλ‘", detail: "100"))
print(sam.address.city) // μλ¬ π¨. μλ¬ λ©μμ§: Chain the optional using '?' to access member 'address' only for non-'nil' base values
sam?.address.city // β
// μΆλ ₯κ°: μμΈ
- λ§μ½ samμ΄ μ΅μ λμ΄ μλ Person νμ μ΄μλ€λ©΄ sam.address.city κ° κ°λ₯νλ€. νμ§λ§ samμ΄ μ΅μ λ νμ μ΄κΈ° λλ¬Έμ addressμ μ κ·Όνλ €λ©΄ sam?.address.city ννλ‘ μ΄λ£¨μ΄μ ΈμΌ νλ€.
- μ μ½λ μ€ “sam?.address.city” μ λ€μ μ΄ν΄λ³΄λ©΄, sam == nil μΌ κ²½μ° μλ¬κ° λμ§ μκ³ λ€ μ½λκ° μ€νλμ§ μλλ€.
λ€λ₯Έ μΈμ΄μ nullμ .μΌλ‘ μ°Έμ‘°λ₯Ό νλ©΄ λ°λ‘ NullPointerException μλ¬κ° λ°μνλ€.
λ°λΌμ Swiftμμμ nilμ λ©λͺ¨λ¦¬μ μ£Όμκ°μ΄ μμμ λνλ΄λ nullμ΄ μλλΌ κ°μ΄ μμμ λνλ΄λ κ°!! (λ©λͺ¨λ¦¬μ μ¬λΌκ° μνμ, μ€μ λ‘λ λ€μμ λ°°μΈ Enum)μ΄λ€.
'Devlogπ©π»βπ» > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] μ΄κΈ°ν(Initializers) (0) | 2024.03.13 |
---|---|
[Swift] 컬λ μ νμ (Collection Type) - Dictionary, Set (2) | 2024.01.24 |
[Swift] 컬λ μ νμ (Collection Type) - Array (3) | 2024.01.23 |
[Swift] String λ¬Έμμ΄μμ Index μ κ·ΌνκΈ°(String.Index) (2) | 2024.01.18 |
[Swift] νμ μΆλ‘ (Type Inference)κ³Ό νμ μ΄λ Έν μ΄μ (Type Annotation) (2) | 2024.01.17 |