MUKER_DEV with iOS

swift / 5๊ฐ€์ง€์˜ Optional ์‚ฌ์šฉ๋ฒ• ๋ณธ๋ฌธ

๐ŸŽ iOS ๊ฐœ๋ฐœ/Swift

swift / 5๊ฐ€์ง€์˜ Optional ์‚ฌ์šฉ๋ฒ•

MUKER 2022. 5. 16. 15:33

๋จผ์ € Optional์˜ ๊ธฐ๋ณธ์ ์ธ ์ •์˜๋Š”

"๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„ ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค" ๋ผ๊ณ  ๋งํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค

 

Optional์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ nil์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์—

๊ฐ’์„ ํƒ€์ดํŠธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด ์—๋Ÿฌ๋ฅผ ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค

 

๋ฐ‘์— Optional์„ ์‚ฌ์šฉํ•˜๋Š” 5๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด๋‹ค

1. Force Unwrapping

2. Cheak for nil value

3. Optional Binding

4. Nil Coalescing Operator

5. Optional Chaining

 

์œ„ 5๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ์˜ต์…”๋„์„ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•ด๋ณด์ž

 

 

์ผ๋‹จ ๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž

 

let myOptional: String?
myOptional = "Muker"
let text: String = myOptional // ์—๋Ÿฌ๊ฐ€ ๋œธ. myOptional์€ ์˜ต์…”๋„ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ

 

์—๋Ÿฌ๊ฐ€ ๋œจ๋Š”๊ฑด ํ˜ธ์žฌ๋‹ค ํ˜ธ์žฌ

์™œ๋ƒ Swift๋Š” ํƒ€์ดํŠธํ•˜๊ฒŒ ํƒ€์ž…์„ ์žก์•„์ฃผ๊ธฐ ๋•Œ๋ฌธ์—

์˜ต์…”๋„์„ ํ• ๋‹นํ•จ์œผ๋กœ์จ nil์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ์—๋Ÿฌ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ช…ํ™•ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ•์ œ๋จ

๊ทธ๋ž˜์„œ ์•ฑ์„ ๋นŒ๋“œํ–ˆ์„๋•Œ nil๋•Œ๋ฌธ์— ๋‚˜์˜ค๋Š” ๋ฌธ์ œ๋ฅผ ์‚ฌ์ „์— ์ฐจ๋‹จํ•ด์ฃผ๋Š” ๋ฐฑ์‹ ์ด ๋จ

 

์•„๋ฌดํŠผ ์ด๋ ‡๊ฒŒ ํ• ๋‹นํ•˜๊ณ  ์ปดํŒŒ์ผ์—๋Ÿฌ๋งŒ ๋งŒ๋“ค๊ณ  ๋๋‚ด๋ฉด ์•ˆ๋˜๋‹ˆ

์œ„ 5๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด์„œ ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด์ž

 

1. Force Unwrapping

 

๋‚œ ์ด ๋ณ€์ˆ˜์— ํ™•์‹คํ•˜๊ฒŒ ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค! ๊ทธ๋ž˜์„œ ์•ˆ์ •์žฅ์น˜ ์—†์ด ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€์—†๋‹ค!

ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋‹น์—ฐํžˆ ๊ฐ•์ œ์ ์ธ ๊ธฐ๋Šฅ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค

 

let myOptional: String?
myOptional = "Muker"
let text: String = myOptional!

 

์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ myOptional์ด text์— ํ• ๋‹น๋ ๋•Œ !๋ฅผ ๋’ค์—๋‹ค ์จ์ฃผ๋ฉด ๋

๋งŒ์•ฝ myOptional์ด nil์ด๋‹ค? ๋ฐ”๋กœ ๋Ÿฐํƒ€์ž„์˜ค๋ฅ˜ ๋ฐœ์ƒ!

 

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•

2. Cheak for nil value

 

if๋ฌธ์œผ๋กœ nil์„ ์ฒดํฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž„

 

let myOptional: String?
myOptional = "Muker"

if myOptional != nil {
    let text: String = myOptional!
} else {
    print("nil์ž…๋‹ˆ๋‹น")
}

 

1๋ฒˆ ๋ฐฉ๋ฒ•์ธ ๊ฐ•์ œ ์–ธ๋žฉํ•‘์—๋‹ค ์กฐ๊ฑด๋ฌธ์„ ํ™œ์šฉํ•ด nil๊ฐ’์ผ๋•Œ ๋น ์ ธ๋‚  ์ˆ˜ ์žˆ๊ฒŒํ•ด์„œ ๋Ÿฐํƒ€์ž„์—๋Ÿฌ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ!

ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๊ฐ€๋…์„ฑ์ด ์•ˆ์ข‹์Œ

์‹ฌ์ง€์–ด ๊ฐ•์ œ ์–ธ๋žฉํ•‘๋„ ํ•ญ์ƒ ํ•ด์ค˜์•ผํ•จ

 

๊ทธ๋ž˜์„œ ์ƒ๊ธด ๊ธฐ๋Šฅ์ด ๋ญ”์ง€๋Š” ๋ชฐ๋ผ๋„ swift๋ฅผ ๊ณต๋ถ€ํ• ๋•Œ ํ•œ๋ฒˆ์ฏค ๋“ค์–ด๋ดค์„ '์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ' ์ž„

 

3. Optional Binding

 

if let safeOptional = optional {
	safeOptional
}

 

์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์€ ๋”์šฑ ๊ฐ„๋‹จํ•ด์ง

if let ์€ ์˜ต์…”๋„์„ ๋ฐ”์ธ๋”ฉํ•˜๊ฒŒ ๋จ

๊ทธ๋ž˜์„œ nil์ด ์•„๋‹ˆ๋ฉด optional ๊ฐ’์€ ๋งŒ๋“ค์–ด๋‘” ์ƒ์ˆ˜ safeOptional ์— ๋ฐ”์ธ๋”ฉ์ด ๋˜์–ด

๊ด„ํ˜ธ ์•ˆ์—์„œ ์˜ต์…”๋„์ด ๋ฒ—๊ฒจ์ง„ safeOptional์„ ์“ธ ์ˆ˜ ์žˆ์Œ!

๊ทธ๋ž˜์„œ ! ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค~

 

let myOptional: String?
myOptional = "Muker"

if let safeOptional = myOptional {
    let text: String = safeOptional
    print(safeOptional) // ์˜ต์…”๋„ ์—†์ด ์ถœ๋ ฅ
} else {
    print("nil์ž…๋‹ˆ๋‹น")
}

 

์ด๋ฒˆ์—๋Š” 4๋ฒˆ์งธ ์‚ฌ์šฉ๋ฒ• nil ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ์•Œ์•„๋ณผ๊นŒ!

 

4. Nil Coalescing Operator

 

์ด๋ฆ„์—์„œ๋„ ๋Š๊ปด์ง„๋‹ค.

๋ณ‘ํ•ฉ == ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ ๋‹ค?

 

optional ?? defaultValue

 

์ด๊ฒŒ ๋ฌด์—‡์ธ๊ฐ€ ํ•˜๋ฏ„

์˜ต์…”๋„ ๊ฐ’์ด nil์ด๋ฉด ?? ๋’ค defaultValue์— ๊ฐ’์ด ์ถœ๋ ฅ๋˜๊ณ 

๋งŒ์•ฝ nil์ด ์•„๋‹ˆ๋ฉด ์˜ต์…”๋„์ด ๋ฒ—๊ฒจ์ ธ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค

 

let myOptional: String?
myOptional = nil

let text: String = myOptional ?? "i am the default value"

print(text) // "i am the dfault value"

 

ํ™•์‹คํžˆ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ๊น”๋”ํ•ด์กŒ๋‹ค

 

๋‹ค์„ฏ๋ฒˆ์งธ ์˜ต์…”๋„ ์ฒด์ด๋‹์€ ๊ตฌ์กฐ์ฒด๊ฐ€ ์˜ต์…”๋„์ผ๋•Œ ์“ฐ์ž„

 

5. Optional Chaining

 

struct MyOptional {
    var property = 123
    func method() {
        print("๋‚˜๋Š” ๊ตฌ์กฐ์ฒด ๋ฉ”์„œ๋“œ")
    }
}

let myOptional: MyOptional? = MyOptional()

print(myOptional!.property) // ์—๋Ÿฌ

 

๊ตฌ์กฐ์ฒด MyOptional์„ ๋งŒ๋“ค๊ณ 

myOptional์— ์˜ต์…”๋„๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค€๋‹ค์Œ

ํ”„๋กœํผํ‹ฐ๋ฅผ ํ”„๋ฆฐํŠธํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€๋‚œ๋‹ค

 

์ด์œ ๋Š” ์•Œ๋‹ค์‹œํ”ผ ์˜ต์…”๋„์„ ํ• ๋‹นํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— nil์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธ์„ ํ•ด์•ผํ•œ๋‹ค

 

print(myOptional!.property)

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ๊ฐ•์ œ์ ์œผ๋กœ ์–ธ๋ž˜ํ•‘ํ•ด๋„ ์‹คํ–‰์ด ์ž˜ ๋˜์ง€๋งŒ

์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค

 

์˜ต์…”๋„์ฒด์ด๋‹์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ต์…”๋„๋’ค์— ๋ฌผ์Œํ‘œ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด๋œ๋‹ค

 

print(myOptional?.property)

 

์ด๋Ÿฐ์‹์œผ๋กœ !๋ฅผ ?๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค

์™œ ์ฒด์ด๋‹์ด๋ƒ

myOptional? ์—์„œ nil์ด ์•„๋‹˜์„ ํ™•์ธํ•˜๋ฉด ์ฒด์ด๋‹ ํ•ด์„œ

๋’ค์—์žˆ๋Š” ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ์— ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค๋Š” ๋œป

 

struct MyOptional {
    var property = 123
    func method() {
        print("๋‚˜๋Š” ๊ตฌ์กฐ์ฒด ๋ฉ”์„œ๋“œ")
    }
}

let myOptional: MyOptional?

myOptional = MyOptional()

myOptional?.property // 123
myOptional?.method() // ๋‚˜๋Š” ๊ตฌ์กฐ์ฒด ๋ฉ”์„œ๋“œ

 

์ด๋ ‡๊ฒŒ ์˜ต์…”๋„ ์‚ฌ์šฉ๋ฒ• 5๊ฐ€์ง€๋ฅผ ๊ณต๋ถ€ํ•ด๋ดค๋‹ค~ ๋!