iOS ๐ŸŽ/Swift

Swfit-04 Optional

yongmin.Lee 2021. 1. 26. 10:24

Optional

- ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„, ์—†์„ ์ˆ˜๋„ ์žˆ์Œ

- nil ํ• ๋‹น ๊ฐ€๋Šฅ
- ๊ธฐ๋ณธ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋ถˆ๊ฐ€ : ์˜ต์…”๋„๊ณผ ์ผ๋ฐ˜ ๊ฐ’์€ ๋‹ค๋ฅธ ํƒ€์ž…์ด๋ฏ€๋กœ ์—ฐ์‚ฐ๋ถˆ๊ฐ€

- Optional ์ข…๋ฅ˜ : ? (Optional), ! (Implicitly Unwrapped Optional)

Optional์ด ํ•„์š”ํ•œ ์ด์œ 

- nil์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ฝ”๋“œ์ƒ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„
- ์˜ต์…”๋„์ด ์•„๋‹Œ ์ƒ์ˆ˜์—๋Š” nil ํ• ๋‹น ๋ถˆ๊ฐ€๋Šฅ -> ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์ด ์˜ต์…”๋„์ด ์•„๋‹ˆ๋ผ๋ฉด nil์ฒดํฌ๋ฅผ ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์•ˆ์‹ฌํ•˜๊ณ  ์‚ฌ์šฉ -> ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์•ˆ์ „ํ•œ ์ฝ”๋”ฉ

// someOptionalParm์— nil์ด ํ• ๋‹น ๋  ์ˆ˜ ์žˆ๋‹ค.
func someFunction(someOptionalParam: Int?) {
       // ....
}

// someParm์— nil์ด ํ• ๋‹น ๋  ์ˆ˜ ์—†๋‹ค.
func someFunction(someParam: Int) {
       // ....
}

someFunction(someOptionalParam: nil)
// someFunction(someParam: nil) : ERROR !!

! : Implicitly Unwrapped Optional

- nil ํ• ๋‹น ๊ฐ€๋Šฅ
- ๊ธฐ์กด ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
- ์ž˜๋ชป๋œ ์ ‘๊ทผ์œผ๋กœ ์ธํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

var iuoVal1: Int! = 100
var iuoVal2: Int! = nil // nil ํ• ๋‹น ๊ฐ€๋Šฅ

iuoVal1 = iuoVal1 + 1 // ๊ธฐ์กด ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
iuoVal2 = iuoVal2 + 1 // ERROR! : ์ž˜๋ชป๋œ ์ ‘๊ทผ์œผ๋กœ ์ธํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

 

? : Optional 

- nil ํ• ๋‹น ๊ฐ€๋Šฅ
- ๊ธฐ๋ณธ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋ถˆ๊ฐ€ : ์˜ต์…”๋„๊ณผ ์ผ๋ฐ˜ ๊ฐ’์€ ๋‹ค๋ฅธ ํƒ€์ž…์ด๋ฏ€๋กœ ์—ฐ์‚ฐ๋ถˆ๊ฐ€

var optVal1: Int? = 100
var optVal2: Int? = nil // nil ํ• ๋‹น ๊ฐ€๋Šฅ

optVal1 = optVal1 + 1 // ERROR! : ๊ธฐ์กด ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
optVal2 = optVal2 + 1 // ERROR! : ์ž˜๋ชป๋œ ์ ‘๊ทผ์œผ๋กœ ์ธํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

 

Optional ์ถ”์ถœ

- ์˜ต์…”๋„์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊บผ๋‚ด์˜ค๋Š” ๊ฒƒ
- ์ถ”์ถœ๋ฐฉ์‹ : Optional Binding, Force Unwrapping

Optional Binding

- nil ์ฒดํฌ + ์•ˆ์ „ํ•œ ๊ฐ’ ์ถ”์ถœ 

- ์˜ต์…”๋„ ์•ˆ์— ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ฐ’์„ ๊บผ๋‚ด์˜ด
- if let ํ‚ค์›Œ๋“œ : if-let์€ ์˜ต์…”๋„ ํƒ€์ž…์˜ ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

Force Unwrapping

- ์˜ต์…”๋„๋ณ€์ˆ˜ ๋’ค์— "!" ๋ฅผ ๋ถ™์ด๋ฉด ๊ฐ•์ œ๋กœ Optional wrap์„ ๋ฒ—๊ธฐ๊ณ  ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค

- ๋งŒ์•ฝ ๊ฐ’์ด ์—†์„๊ฒฝ์šฐ(nil) ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ