๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IOS๐ŸŽ/iOS+Swift

[Swift] Optional์— ๋Œ€ํ•œ ๊ณ ์ฐฐ

by Jouureee 2022. 4. 23.

Swift๋Š” ์•ˆ์ „์„ฑ์„ ์ค‘์š”ํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ฐ”ํƒ•์ด ๋˜๋Š” ๋ฌธ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ์˜ต์…”๋„(Optional)์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ ์˜ต์…”๋„์„ ๋ดค์„๋•Œ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ์ฐพ์•„๋ณผ ์ˆ˜ ์—†๋Š” Swift๋งŒ์˜ ๋…ํŠนํ•œ ๋ฌธ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. 

์–ผ๋งˆ์ „ ์˜ต์…”๋„์„ ๋žฉํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด๋Ÿฐ ๋žฉํ•‘ํ•˜๋Š” ๋ฐฉ์‹์ด ๊ท€์ฐฎ์„ ๋ฒ•(?)๋„ ํ•œ๋ฐ ์™œ ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์˜ต์…”๋„์€ ์˜ต์…”๋„์ด์ง€ ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณธ์ ์ด ์—†์–ด์„œ nil๊ฐ’์ผ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋ผ๋Š” ์—‰๋šฑํ•œ ๋Œ€๋‹ต์„ ํ•œ๊ฒŒ ์ฐธ ์•„์‰ฝ๋”๋ผ๊ตฌ์š” ..(nil๋„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋‹ค๋ฅธ ๊ฐ’๋“ค๊ณผ ๊ฐ™์ด ๊ฐ’์„ ๊ฐ€์ง„๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค ํ•˜ํ•˜) ๊ทธ๋Ÿฌ๋˜ ์ค‘ ์˜ต์…”๋„์— ๋Œ€ํ•ด ์ข‹์€ ๊ธ€์„ ์ฝ๊ฒŒ ๋˜์–ด ๋ฉด์ ‘๋•Œ ๋งˆ์ € ๋ชปํ•œ ์ƒ๊ฐ๊ณผ ๊ทธ ๋Œ€๋‹ต์„ ๋‹ค์‹œ ํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค !!

 

Optional์ด๋ž€ ?

๊ฐ’์ด ์žˆ์„์ˆ˜๋„ ์—†์„์ˆ˜๋„(nil)์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ํƒ€์ž…์— "?" ๊ธฐํ˜ธ๋ฅผ ๋ถ™์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

var a: Int?
func b() -> String? { }
var arr: [Double?]

ํƒ€์ž…์„ ์„ ์–ธํ• ๋•Œ๋„ ์‚ฌ์šฉ๋˜๊ณ , ํƒ€์ž… ์บ์ŠคํŒ…์„ ํ• ๋•Œ๋„ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์˜ต์…”๋„์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

var a = 123
var str = Int(a) // Int? ํƒ€์ž…

 

์ฆ‰ ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Œ์„ ์•Œ๋ ค์ฃผ๋ฉฐ ์ด๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ๊ฐ’์ด ์žˆ์Œ์„ ๋ณด์žฅํ•œ์ฑ„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…”๋„์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ์‹์—๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Forced Unwrapping

๋ง ๊ทธ๋Œ€๋กœ ๊ฐ•์ œ๋กœ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ’์ด ์žˆ์„ ๊ฒฝ์šฐ ์ƒ๊ด€์ด ์—†์ง€๋งŒ ๊ฐ’์ด nil์ผ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

var str: String? = “Hello”
print(str!)

 

Optional Binding - if let

Optional ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

if let์„ ํ†ตํ•ด ์˜ต์…”๋„ ๋ณ€์ˆ˜๊ฐ€ nil๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋’ค ํ•ด๋‹น ๊ด„ํ˜ธ ์•ˆ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์–ธ๋ž˜ํ•‘ํ•˜์—ฌ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var str: String? = "Hello"
if let str = str { // ์ˆ˜ํ–‰ 
}

 

Optional Binding - guard let else 

๋˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์€ guard let์„ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. else ๊ตฌ๋ฌธ์— ์˜ต์…”๋„ ๋ณ€์ˆ˜ str์ด nil์ผ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

var str: String? = "Hello"
guard let str = str else {
	//nil์ผ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ
}

 

๊ทธ๋ ‡๋‹ค๋ฉด ์˜ต์…”๋„์„ ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š” ? ๋ชจ๋“ญ ํƒ€์ž…์„ ์˜ต์…”๋„์ด ์•„๋‹Œ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์ผ๊นŒ์š” ? ์ฒ˜์Œ์—” ์ด์— ํ•ด๋‹ต์„ ์ฐพ์ง€ ๋ชปํ•˜๋‹ค๊ฐ€ ์ข‹์€ ๊ธ€์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

https://medium.com/hcleedev/swift-optional-%EC%9E%98-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0-optional-chaining%EA%B3%BC-binding-948049411a3f

 

Swift: Optional ์ž˜ ํ™œ์šฉํ•˜๊ธฐ (Optional Chaining๊ณผ Binding)

Optional๊ณผ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ Operator์™€ ๊ตฌ๋ฌธ์„ ์•Œ์•„๋ณด์ž

medium.com

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ view์— ๋ฟŒ๋ ค์ฃผ๋Š” ์ž‘์—…์„ ํ•  ์‹œ, ์˜ต์…”๋„ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ๋•Œ ๋„คํŠธ์›Œํ‚น ์ž‘์—…์œผ๋กœ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ฒ˜์Œ์—” nil๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ ๋กœ๋”ฉ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ง ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด nil ๊ฐ’์„ ๊ฐ€์ง€๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ›์•„์˜ค๋Š” ์ค‘์ž„์„ ๊ตฌ๋ณ„ํ•˜์—ฌ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์œ ์šฉํ•œ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฐ’์ด nil์ผ๋•Œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ž‘์—…์„ ๋ถ„๊ธฐํ•ด์„œ ์ƒ๊ฐํ• ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ •๋ง ์•ˆ์ „์„ฑ์„ ์ค‘์š”์‹œ ํ•˜๋Š” ์–ธ์–ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. 

 

์˜ต์…”๋„ ํƒ€์ž…์„ if, guard๋ฅผ ์จ์„œ ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” ๋Œ€์‹  ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

https://jusung.gitbook.io/the-swift-language-guide/language-guide/16-optional-chaining

 

์˜ต์…”๋„ ์ฒด์ด๋‹ (Optional Chaining) - The Swift Language Guide (ํ•œ๊ตญ์–ด)

์˜ต์…”๋„ ์ฒด์ด๋‹์€ ์˜ต์…”๋„ ๊ฐ’ ๋’ค์— ๋ฌผ์Œํ‘œ(?)๋ฅผ ๋ถ™์—ฌ์„œ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์—๋Š” ํ”„๋กœํผํ‹ฐ, ๋ฉ”์†Œ๋“œ ๊ทธ๋ฆฌ๊ณ  ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ ๋ฉ๋‹ˆ๋‹ค. ์˜ต์…”๋„ ๊ฐ’์„ ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘ ํ•˜๊ธฐ์œ„

jusung.gitbook.io

์˜ต์…”๋„ ์ฒด์ด๋‹์€ ๋ฐ”์ธ๋”ฉ ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ณ  ์˜ต์…”๋„ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ?๋ฅผ ๊ทธ๋Œ€๋กœ ์จ์„œ ๊ฐ’ ์†์„ฑ์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ฐ”์ธ๋”ฉ๋ณด๋‹ค ์ ‘๊ทผํ• ๋•Œ ?๋ฅผ ๋ถ™์ด๋ฉด ๋˜๋ฏ€๋กœ ๊ฐ„๊ฒฐํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

๋Œ“๊ธ€