์ฐ๋ฆฌ๋ ์ต์ ๋์ ๋ํด ๋ฌผ์์ ๋, ์ผ๋ง๋ ์ ๋๋ตํ ์ ์์๊น?
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
https://devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-2/optionals.html
'๐ iOS & Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Convenience init(ํธ์ ์ด๋์ ๋ผ์ด์ ) (2) | 2021.08.22 |
---|---|
[iOS] frame๊ณผ bounds (0) | 2021.08.20 |
iOS Issue(1) - Build input file cannot be found (0) | 2021.07.30 |
[iOS] ๋๋ ๋ชจ๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์์๋ Generic (0) | 2021.07.29 |
[iOS] CollectionView์ PageControl๋ก Pager ๊ตฌํํ๊ธฐ (9) | 2021.07.26 |