๐ŸŽ iOS & Swift

[iOS] ์˜ต์…”๋„, Optional

taeeekki 2021. 8. 18. 22:25

Swift Basic - Optional

์šฐ๋ฆฌ๋Š” ์˜ต์…”๋„์— ๋Œ€ํ•ด ๋ฌผ์—ˆ์„ ๋•Œ, ์–ผ๋งˆ๋‚˜ ์ž˜ ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์„๊นŒ?

Summary

  • ์˜ต์…”๋„์€ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ์ƒํƒœ(nil)๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Swift์— ๋„์ž…๋œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
  • ์˜ต์…”๋„์€ Enum ํ˜•ํƒœ๋กœ ์ •์˜๋˜์–ด ์žˆ๊ณ , ๊ฐ’์˜ ์žˆ๊ณ  ์—†์Œ์„ ๊ฐ Case๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ต์…”๋„๋กœ ํ‘œํ˜„๋œ ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” Forced Unwrapping(๊ฐ•์ œ ์–ธ๋ž˜ํ•‘), Optional Binding(์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ), Nil-Coalescing Operator(Nil๋ณ‘ํ•ฉ์—ฐ์‚ฐ์ž)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ํ†ตํ•ด์„œ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ํ‘œํ˜„๋œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ต์…”๋„(Optional) ๋„ˆ๋ž€ ๋…€์„

์˜ต์…”๋„์˜ ์˜๋ฏธ

์ž ์šฐ๋ฆฌ๋Š” ๊ทผ๋ณธ์žˆ๋Š” ๊ฐœ๋ฐœ์ž์ด๊ธฐ ๋•Œ๋ฌธ์— Apple ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋„๋ก ํ•˜์ฃ . (์‚ฌ์‹ค ์ •์˜๋งŒ ์‚ดํŽด๋ณผ๊ฑฐ์ž„..ใ…Žใ…Ž)

A type that represents either a wrapped value or nil, the absence of a value.

๋‚ด์šฉ์„ ํ•œ ๋ฒˆ ์ดํ•ดํ•ด๋ณด์ž๋ฉด ์˜ต์…”๋„์€ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ์ƒํƒœ(nil)๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Swift์— ๋„์ž…๋œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์•„์ง ์ดํ•ด๊ฐ€ ์•ˆ๋˜์—ˆ๋”๋ผ๋„ ๊ทธ๋ƒฅ ์ญ‰ ๋ŒํŒŒํ•ด๋ณด์ฃ .

์˜ต์…”๋„ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” ๋ณ€์ˆ˜์˜ ์œ ํ˜• ๋์—  ? ๋ฅผ ๋ถ™์—ฌ์„œ ์˜ต์…”๋„์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐ๊ฐ’์„ ์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ nil ์ž…๋‹ˆ๋‹ค.

 

๋ฌผ์Œํ‘œ๋ฅผ ๋ถ™์ธ๋‹ค๊ณ  ํ•˜๋„ค์š”? ์‚ฌ์‹ค ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ์ดํ•ด๋ฅผ ํ•ด๋ณด๋ฉด

๋ฌผ์Œํ‘œ๋ฅผ ๋ถ™์ธ๋‹ค๋Š” ์˜๋ฏธ๋Š” ํ™•์‹ ์ด ์—†์–ด์„œ ๋˜๋Š” ๊ถ๊ธˆํ•ด์„œ ์š”๋Ÿฐ ์˜๋ฏธ๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”. ๊ทธ๋Ÿผ ์กฐ๊ธˆ ๋” ์ƒ๊ฐ์„ ํ™•์žฅ์‹œ์ผœ๋ณผ๊ฒŒ์š”.

var age: Int?

 

์š”๋ ‡๊ฒŒ age๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์˜ต์…”๋„ Intํ˜•์œผ๋กœ ์„ ์–ธ์„ ํ•ด์ฃผ์—ˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

swift๋„ ์—ญ์‹œ (ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ํ•ด์„์„ ํ•ด๋ณด๋ฉด์š”.

 

age์•ผ, ๋„ˆ Int ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ˆ? ๋ผ๊ณ  ๋ฌผ์–ด๋ณด๊ณ  ์žˆ๋Š” ๊ฑฐ์˜ˆ์š”.

ํ•œ ๋งˆ๋””๋กœ ์ง€๊ธˆ age๊ฐ€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€, ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š”์ง€ ๋ชจ๋ฅด๋Š”๊ฑฐ์ฃ . (๋ฒ ์ผ์— ์Œ“์—ฌ์žˆ๋Š” age...)

 

๊ฐ’์ด ๋งŒ์•ฝ์— ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” swift์—์„œ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” nil์ผํ…Œ๊ณ ,

์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด์žˆ๋‹ค๋ฉด Intํ˜•์˜ ์–ด๋–ค ๊ฐ’์ด๊ฒ ์ฃ ?

 

์ž ๊ทธ๋ฆฌ๊ณ  ๊ฐ’์ด ์—†์Œ์„ ํ‘œํ˜„ํ•˜๋Š” nil ์ด๋ผ๋Š” ๊ฐ’์€ ์ •๋ง ํŠน๋ณ„ํ•œ ๋…€์„์ด์˜ˆ์š”.

Optional ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉด nil๊ฐ’์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜๊ฐ€ ์—†์–ด์š”.

 

var id: String = nil (x)

 

๋งŒ์•ฝ์— ํŠน์ •ํ•œ ํƒ€์ž…(Int, String, Float ...)์˜ ๋ณ€์ˆ˜์— nil์„ ๋„ฃ์œผ๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•„์ด๊ตฌ,, ์•ˆ์ „ํ•œ ๋…€์„

์•„ ์˜ค์ผ€์ด!! ๊ทธ๋Ÿฌ๋ฉด ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ ๋ฐ˜๋Œ€์ผ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ ์˜ต์…”๋„์„ ์“ฐ๋Š” ๊ฑฐ๊ตฌ๋‚˜!!

๋„ค ๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” ์˜ต์…”๋„์ด ์–ด๋–ค ๋…€์„์ธ์ง€๋Š” ์•Œ์•˜์–ด์š”. ๊ทธ๋Ÿผ ์˜ต์…”๋„ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„์•ผ๊ฒ ์ฃ ? ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๋ด…์‹œ๋‹ค.


์˜ต์…”๋„์„ ๋œฏ๊ณ  ์ฆ๊ธฐ๋Š” ๋ฐฉ๋ฒ•, ์–ธ๋ž˜ํ•‘(Unwrapping)

์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€ ๋ฒ”์ฃผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•, ์กฐ๊ธˆ์€ ์œ„ํ—˜ํ•˜์ง€๋งŒ ๊ฐ•์ œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๊ธ‰์ ์ด๋ฉด ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘๋ณด๋‹ค๋Š” ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•ด์„œ ์–ธ๋ž˜ํ•‘ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค :)

์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ(Optional Binding) - if ~ let ๊ตฌ๋ฌธ, guard ~ let ๊ตฌ๋ฌธ

์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์ด๋ž€ ์˜ต์…”๋„์˜ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฒ€์‚ฌํ•œ ๋‹ค์Œ์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ดํ•ด๊ฐ€ ์•ˆ๋  ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์ฝ”๋“œ๋กœ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ฃ .

// 1) if ~ let binding
var optionalId: String? = "2000389501"
var optionalPassword: String? = "xY23TdsY"

if let id = optionalId, password = optionalPassword {
  // ๋ชจ๋‘ ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค๋ฉด if๋ฌธ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ ์‹คํ–‰
}
// 2) guard ~ let binding
var name: String? = nil

guard let unwrapped = name else {
    print("You didn't provide a name!")
    return
}

๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ํ‘œํ˜„์‹์ด nil์ผ ๋•Œ์™€ ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๊ฒŒ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด ์ •๋ง ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ํ˜•์‹์ž…๋‹ˆ๋‹ค!

 

ํ•œ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด TableViewCell ๋˜๋Š” CollectionViewCell์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋„ ์ •๋ง ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ์ฃ !

 

๊ฐ•์ œ ์–ธ๋ž˜ํ•‘(force unwrapping)

๋งŒ์•ฝ์— ์šฐ๋ฆฌ๊ฐ€ ์–ด๋– ํ•œ ๊ฐ’์ด nil์ด ์•„๋‹ˆ๋ผ๊ณ  ํ™•์‹คํžˆ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ต์…”๋„์„ ๊ฐ•์ œ๋กœ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์šฐ๋ฆฌ๋Š” ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘(force unwrapping)์ด๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ! ๋ฅผ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”. ๋„ˆ ํ™•์‹คํžˆ ์žˆ๋Š”๊ฑฐ ๋‹ค ์•Œ์•„ ๋‹น์žฅ ๋‚˜์™€! ์ด๋Ÿฐ ๋А๋‚Œ์œผ๋กœ ๋ด๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ํ•จ๊ป˜ ๋ณผ๊นŒ์š”?

// ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆซ์ž๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด์ด ์žˆ์œผ๋ฉด ์šฐ๋ฆฌ๋Š” Int๋กœ ํƒ€์ž… ๋ณ€ํ™˜์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
let str = "5"
let num = Int(str)

// ์šฐ๋ฆฌ๊ฐ€ num์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ๋ฐ˜๋“œ์‹œ ์ •์ˆ˜๋งŒ ๋‹ด๊ธด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด
let num = Int(str)! 

// ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// Int?๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

 

์œ„์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๊ฐ€๊ธ‰์  ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘๋ณด๋‹ค ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ์ด์šฉํ•ด์„œ ์˜ต์…”๋„์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฌด์‹ฌ์ฝ” !๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ถฉ๋Œ์„ ๋งŒ๋‚˜์„œ ์•ฑ์ด ์ฃฝ์–ด๋ฒ„๋ฆด ์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ ~!


๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ „ํ•œ ์„ ํƒ, Nil ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž(Nil-Coalescing Operator)

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

 

์•„๊นŒ ์˜ต์…”๋„์€ ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ–ˆ์ž–์•„์š”? ์šฐ๋ฆฌ๋Š” ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ์— nil์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ๋ณธ๊ฐ’์„ ์ •ํ•ด์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด๋•Œ ํ•ด๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ์–ด์š”. if ~ else๋ฌธ์œผ๋กœ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ ๋„ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”!

// ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆซ์ž๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด์ด ์žˆ์œผ๋ฉด ์šฐ๋ฆฌ๋Š” Int๋กœ ํƒ€์ž… ๋ณ€ํ™˜์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
let str = "5"
let num = Int(str)

// ์šฐ๋ฆฌ๊ฐ€ num์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ๋ฐ˜๋“œ์‹œ ์ •์ˆ˜๋งŒ ๋‹ด๊ธด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด
let num = Int(str)! 

// ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// Int?๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•, ์˜ต์…”๋„ ์ฒด์ด๋‹(Optional Chaining)

ํ•ด๋‹น ๋ถ€๋ถ„์€ ์ „์ˆ˜์—ด๋‹˜์˜ 40์‹œ๊ฐ„๋งŒ์— Swift๋กœ iOS ์•ฑ ๋งŒ๋“ค๊ธฐ ๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ต์…”๋„ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๊น”๋”ํ•˜๊ฒŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์˜ ๊ณผ์ •์„ ? ๋กœ ์ค„์—ฌ์ค„ ์ˆ˜๊ฐ€ ์žˆ์–ด์š”.

์ข‹์€ ์˜ˆ์‹œ๊ฐ€ ์žˆ์–ด์„œ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

let array: [String]? = []
var isEmptyArray = false

if let array = array, array.isEmpty {
  isEmptyArray = true
} else {
  isEmptyArray = false
}

isEmptyArray
let isEmptyArray = array?.isEmpty == true

์˜ต์…”๋„ ์ฒด์ด๋‹์„ ์ด์šฉํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋ธ”๋Ÿญ์„ ๋‘ ๋ฒˆ์งธ์ฒ˜๋Ÿผ ์ •๋ง ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ์ธ๋ฐ์š”.

๋นˆ ๋ฐฐ์—ด์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด nil ์ด ์•„๋‹ˆ์–ด์•ผ ํ•˜๊ณ , ์š”์†Œ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์˜ต์…”๋„ ์ฒด์ด๋‹์ด๋ž€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋ฅผ ํƒ€๊ณ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋‹ค๊ฐ€, ์ค‘๊ฐ„์— nil์„ ๋งŒ๋‚˜๋ฉด ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

  • array๊ฐ€ nil์ธ ๊ฒฝ์šฐ
    • array?.isEmpty 
      ~~~~~~ ์—ฌ๊ธฐ๊นŒ์ง€ ์‹คํ–‰๋˜๊ณ  `nil`์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • array๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ
    • array?.isEmpty 
      ~~~~~~~~~~~~~~ ์—ฌ๊ธฐ๊นŒ์ง€ ์‹คํ–‰๋˜๊ณ  `true`๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • array์— ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    • array?.isEmpty 
      ~~~~~~~~~~~~~~ ์—ฌ๊ธฐ๊นŒ์ง€ ์‹คํ–‰๋˜๊ณ  `false`๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ ˆํผ๋Ÿฐ์Šค

https://developer.apple.com/documentation/swift/optional

 

Apple Developer Documentation

 

developer.apple.com

https://devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-2/optionals.html

 

์˜ต์…”๋„ (Optional) · 40์‹œ๊ฐ„๋งŒ์— Swift๋กœ iOS ์•ฑ ๋งŒ๋“ค๊ธฐ

 

devxoul.gitbooks.io

https://github.com/Taehyeon-Kim/100DaysOfSwift/blob/master/day1-15_%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8%EB%AC%B8%EB%B2%95/day12.md

 

GitHub - Taehyeon-Kim/100DaysOfSwift: ๐ŸŒฑ 100์ผ๊ฐ„์˜ Swift

๐ŸŒฑ 100์ผ๊ฐ„์˜ Swift. Contribute to Taehyeon-Kim/100DaysOfSwift development by creating an account on GitHub.

github.com