ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค ๋ง๋ค ํน์์ด ํ๋์ฉ ์๋ ๊ฒ ๊ฐ๋ค.
Swift์ ์ธ์ด ํน์์ ์ต์ ๋์ด ์๋๊น,,
์์ํ์ง๋ง ์ค์ํ ๊ฐ๋ optional์ ๋ํด์ ์์๋ณด์ฅ!
1. nil
optional์ ์์ nil์ ์์์ผ ํฉ๋๋ค.
nil์ ์ฝ๊ฒ ์๊ฐํด์ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฅธ ์ธ์ด์์ ์ตํ ์ฐ๋ null๋ก ์ดํด ํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฆ ๋ณ์๊ฐ nill์ด๋ผ๋ ๊ฒ์ ๊ฐ์ด ์์์ ์๋ฏธํฉ๋๋ค. ํ์ง๋ง swift๋ ์ผ๋ฐ์ ์ธ ๋ณ์์ nill๊ฐ์ ๋ฃ์ ์ ์์ต๋๋ค.
์ด๋ ์ฐ๋ฆฌ๋ Optional์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
2. Optional
์ด ๋ณ์์๋ ๊ฐ์ด ์์ ์๋ ์๊ณ , ์์ ์๋ ์์ต๋๋ค!
๋๋์ฒด ๋ฌด์จ ๋ง์ผ๊น ์ถ๊ฒ ์ง๋ง, ๋ง ๊ทธ๋๋ก ์ ๋๋ค. ๋ณ์๊ฐ nill์ผ ์๋ ์๊ณ , ์๋ ์๋ ์๋ค๋ ๊ฒ ์ ๋๋ค.
๋ณ์์ ๊ฐ์ด ์์ ๋ ํธ์ถ์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๊ฐ์ ๋จผ์ ์ ์ธํ๋ผ๋ ์ค๋ฅ๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๊ฐ์ด ์์ ์๋ ์๊ณ , ์์ ์๋ ์๋ค๊ณ ๋งํด์ฃผ์ด์ผ ํฉ๋๋ค. Optional๋ก์!
3. Optonal ์ ํํ
optional์ Optional<type> ๋๋ type๋ค์ ๋ฌผ์ํ(?)๋ฅผ ๋ถ์ฌ์ ๋ํ๋ ๋๋ค. (๋์ด์ฐ๊ธฐ โ)
var num : Optional<Int>
var num2 : Int?
var str : Optional<String>
var str2 : String?
๋ค์ ๊ฐ์ ์ ์ธํ์ง ์์ผ๋ฉด default๋ก nil์ด ์ ์ธ๋ฉ๋๋ค. ๋ฌผ๋ก , nil ์ธ์ type์ ๋ง๋ ์ด๋ค ๊ฐ์ ์ ์ธ ํ ์ ์์ต๋๋ค.
๋ณด์๋ค ์ํผ Optional๋ก ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ฌ์ฉํ๋ฉด ์ถ๋ ฅํ ๋ Optional()์ผ๋ก wrapping ๋์ด ์์ต๋๋ค.
์ค๋ก์ง ๋ณ์๋ง ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฐ๋ฆฌ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3. Forced Unwrapping
๊ฐ์ ๋ก wrapping์ ๋ฒ๊ฒจ๋ผ ์ ์์ต๋๋ค. ๋จ, ์ด ๋ถ๋ถ์ ๋ณ์๊ฐ ๋ณด์ฅ์ด ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ณ์๋ค์ ๋๋ํ๋ฅผ ๋ถ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// ์ถ๋ ฅํ ๋ unwrapping
var str : String? = "hello"
print(str!)
// ์ ์ธํ ๋ unwrapping
var str2 : String! = "goodbye"
print(str2)
์ฃผ์ํ ์ ์ nil์ ์ ์ธํ๊ณ ๊ฐ์ ์ถ์ถํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋น๋๋ค.
๊ฐ์ ์ถ์ถํ ๊ฒฝ์ฐ type์ญ์ ์ถ์ถ๋ ๊ฐ์ type์ผ๋ก ๋ฐ๋๊ฒ ๋ฉ๋๋ค. ์ฆ, str! ์ type์ด String์ด๋ผ๋ ๊ฒ ์ ๋๋ค.
nil์ Optional์๋ง ์ฌ์ฉ ๊ฐ๋ฅ ํฉ๋๋ค. ๊ฐ์ ์ถ์ถํ๋ฉด Optional์ด ์๋๋ฏ๋ก ์๋ฌ๊ฐ ๋จ๋ ๊ฒ ์ ๋๋ค.
Nil coalescing
๊ฐ์ ๋ก unwarping ํ๋ฉด์ ์ค๋ฅ๊ฐ ๋์ง ์๊ฒ ํ๊ณ ์ถ์๋๋ Nil coalescing์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
nill coalescing์ ์ต์ ๋ ๊ฐ์ด nil์ด ์๋๊ฒฝ์ฐ๋ unwarping ํ๊ณ , nil์ธ ๊ฒฝ์ฐ์๋ ์ง์ ํ ๊ฐ์ผ๋ก ๋์ฒด ํฉ๋๋ค.
var str : String? = "hello"
print((str ?? "nil") // "hello"
var num : Int?
print((num ?? 0)) // 0
4. Optional Binding
if let
if ๋ฌธ์ ์ด์ฉํ์ฌ optional์ ๊ฐ์ด ์๋ค๋ฉด ์์ ๋ณ์์ ๊ฐ์ ํ ๋นํฉ๋๋ค.
์์๋ณ์๋ฅผ ์ ์ธํ๊ณ , ๊ฐ์ด ์์ผ๋ฉด ์์๋ณ์์ Optinal()์ ๋ฒ๊ธด value๊ฐ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
์ฆ, ์๋์ ์ฝ๋๋ temp๋ผ๋ ๋ณ์์ "hello"๋ผ๋ ๊ฐ์ ์ฃผ๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ str = nil ์ด๋ผ๋ฉด ์๋์ if๋ฌธ ๋ด์ฉ์ ์คํ๋์ง ์์ต๋๋ค.
var str : String? = "hello"
if let temp = str {
print(temp)
}
// "hello"
guard let
guard let์ ํจ์ ๋ด์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ต์ ๋ str์ ๊ฐ์ด ์๋ค๋ฉด value์ ๊ทธ ๊ฐ์ ์ ์ฅํฉ๋๋ค.
str = nil ์ด๋ผ๋ฉด else์ ํด๋นํ๋ ์ฝ๋์ธ {...} ๋ถ๋ถ์ ์คํํฉ๋๋ค.
nil์ด ์๋๋ผ๋ฉด guard์์ ์ ์ธํ ์์๋ณ์๋ ํจ์๋ด์์ ์ง์ญ๋ณ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
func example(){
var str : String? = "Hello"
guard let value = str else{
print("str is nil")
return
}
print("str is \(value)")
}
example() // str is Hello
7. readLine()์์ unwarpping
๋๊ฒ ๋ณ์๋ฅผ ์ ์ธํ ๋๋ optinal์ ์์ฃผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ด๋ค ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ๊ทธ return ๊ฐ์ด Optional๋ก ๋ฐํ๋๋ ๊ฒฝ์ฐ์ unwarp์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋๋ ์ ๋ ฅ์ ๋ฐ๋ readLine()์ ์ฌ์ฉํ ๋ ์ ๋๋ค.
readLine()์ ์ ๋ ฅ๋ฐ์ ๊ฐ์ Optional<String>์ผ๋ก ๋ฐํ ํฉ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ readLine()๋์ readLine()!์ ์ฌ์ฉํ์ฌ String์ ๋ฐ์ ์ ์์ต๋๋ค.
var input = readLine()!
์ด ์ธ์ Optional๋ก ๋ฐํ๋๋ ํจ์์ ๋๋ํ(!)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ก unwrapping ํ ์ ์์ต๋๋ค.
8. ์ฐธ๊ณ (ํ์ ๋ณํ)
String -> int / int -> String ์ ๊ฒฝ์ฐ ๋ณํํ๊ณ ์ ํ๋ ๊ฐ์ด Optional์ด๋ผ๋ฉด ํ์ ๋ณํ์ด ๋ถ๊ฐ๋ฅ ํฉ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก unwrapping ํ์ ํ์ ๋ณํ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
var num : Int? = 210815
var str : String = String(num!)
'๐ Programming > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ์ ์ด๋ฌธ (์กฐ๊ฑด๋ฌธ / ๋ฐ๋ณต๋ฌธ) (0) | 2022.01.18 |
---|---|
[Swift] function / ํจ์ (0) | 2022.01.15 |
[Swift] collection type / ์ปฌ๋ ์ ํ์ (0) | 2022.01.14 |
[Swift] ๋ณ์์ ์์ ๊ทธ๋ฆฌ๊ณ type (0) | 2021.08.15 |
[Swift] Xcode๋ก ์์ํ๊ธฐ(feat.MacBook) (0) | 2021.08.15 |