์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค! ์ค๋์ ์ต์ ๋๊ณผ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์์ ๊ณต๋ถํ๋ swift ๊ณต์๋ฌธ์ The Basicํธ์๋ ์ ๊น ๋์์๋๋ฐ, ๊ธฐ์กด์ ์ ๊ฐ ๊ณต๋ถํ๋ python ์ธ์ด์์๋ ์์๋ ๊ฐ๋ ์ด๋ผ ์์ํ๋๋ฐ์, ๋ค์ ๊ณต๋ถํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค! ์์~
์ต์ ๋ (optional)
์ ํ์ ์ธ, ์ด๋ผ๋ ๋ป์ ๊ฐ์ง ํ์ ์ด๋ค. ๊ฐ์ด ์์ ์๋ ์๊ณ ์์ ์๋ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด๊ฒ ๋ฌด์จ๋ง์ธ๊ฐ?
var name: String = "potato"
์์ ๊ฐ์ด name์ด๋ผ๋ ๋ณ์๊ฐ ์๋ค. ํด๋น ๋ณ์๋ ์ง๊ธ potato๋ผ๋ sring์ ๊ฐ๊ณ ์๋ค. ๊ทธ๋ผ ๊ฐ์ด ์๋ค๋ฉด?
var name: String = ""
์ด๋ ๊ฒ ์ ์ํ๋ฉด ๋์ง ์๋๊ฐ? ํ์ง๋ง , ์ ์ฝ๋๋ฅผ ์ง์ญ(?)ํด๋ณด๋ฉด ๊ฒฐ๊ตญ name์ String ํํ์ "" ๋น๋ฌธ์์ด์ ์ด์จ๋ ๊ฐ๊ณ ์๋ ๊ฒ์ด๋ค.
์ฝ๋์์๋ ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ ๊ฒ์, null๊ฐ์ ์๋ฏธํ๋ค. ๊ทผ๋ฐ, ์ฌ๊ธฐ์ ์ ๊น! Swift๋ null๊ฐ์ด ์๋๋ผ nil ์ด๋ผ๊ณ ํํํ๋ค :) ์ฆ, ๊ฐ์ด ์๋ค๋ ๊ฒ์ ์๋์ ๊ฐ์ ํํ๊ฐ ๋์ด์ผํ๋ค!!
var name: String? = nil
์ต์ ๋ ๋ณ์์ ํํ ๋ฐ ํน์ง
๊ทธ๋ ๋ค๊ณ nil์ด๋ผ๋ ๊ฐ์ ์๋ฌด๋ฐ๋ ๋ฃ์ ์๋ ์๋ค. ์ ์ฝ๋์์ ๋ณด์๋ฏ์ด nil ์ฒ๋ผ ๊ฐ์ด ์์ ์๋ ์๊ณ , ์์ ์๋ ์๋ ๋ณ์๋ฅผ ์ง์ ํ ๋์๋ ? ๋ฌผ์ํ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ ์ต์ ๋ ๋ณ์์๋ ์ด๊ธฐ๊ฐ์ ์ค์ ํ์ง ์์ผ๋ฉด nil ๊ฐ์ ๋ํดํธ๋ก ๊ฐ์ง๋ค.
์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ๊ฐ์ด null ๊ฐ์ ๊ฐ๊ฒ ๋๋ฉด, ๋ฐํ์์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ํ์ง๋ง swift์์๋ ์์ ์ฑ์ด ์ฅ์ ์ธ ์ธ์ด์ด๋ฏ๋ก, ๊ฐ์ด ์์ ์๋ ์๋ ๋ณ์๋ฅผ ์ง์ ํ๋ฏ๋ก์จ ์ด๋ฌํ ์ค๋ฅ๋ฅผ ๋ฏธ์ฐ์ ๋ฐฉ์งํ๋ค.
์๋์ ๊ฐ์ด ๋ณ์์ ํ์ ์ ์ต์ ๋ ํ์ ์ผ๋ก ์ง์ ํ ์์๋ค.
var name: String?
๋ํ ์ต์ ๋ ๋ณ์์๋ ๊ฐ์ด ์๋ ๋ณ์๋ก ์ด๊ธฐ ์์ฑํ ์ ์๋ค.
var optionalValue: String? = "potato"
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, ์ด๊ธฐ๊ฐ์ potato์ด์ง๋ง, string์ต์ ๋ ํ์ ์ ๊ฐ์ง๋ฏ๋ก, ์ถํ nil ๊ฐ์ ๊ฐ์ง ์๋ ์๋ค.
์ฃผ์ํ ์ ์ด ์๋ค. ์์ฐํ String? ๊ณผ Sring์ ๋ค๋ฅด๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ ์ฝ๋๋ ์ค๋ฅ๋ฅผ ๋ฐ์ํ๋ค. (๋ค๋ฅธํ์ ์ด๊ธฐ ๋๋ฌธ)
var optionalValue: String? = "potato"
var newValue: String = optionalValue
// ERROR message : Value of optional type 'String?' must by unwrapped to a value of type 'String'.
/* ์ต์
๋ ๋ณ์๋ฅผ wrapped๋ผ๊ณ ํ๋ค.
์๋ํ๋ฉด, ํด๋น optionalValue๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด
optional("potato")๋ผ๊ณ ์ถ๋ ฅ๋๋๋ฐ, ์ด๋ฅผ optional๋ก ํฌ์ฅ๋์ด์๋ค๊ณ ํด์ํ ์ ์๋ค. */
์ ์ฝ๋๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค. ์๋๋ฉด newValue๋ ์ผ๋ฐ String๋ณ์์ธ๋ฐ, ์ฌ๊ธฐ์ ์ต์ ๋ ๋ณ์์ธ optionalValue๋ฅผ ์ ์ฅํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ํฌ์ฅ๋์ด์๋ ์ต์ ๋ ๋ณ์๋, ์ผ๋ฐ ํ์ ๋ณ์์ ๊ฒฐํฉ๋, ์ฐ์ฐ๋ ๋ถ๊ฐ๋ฅํ๋ค. ์ด ์ฐ์ฐ์ ์คํํ๋ ค๋ฉด ์ต์ ๋ ๋ฐ์ธ๋ฉ์ด ํ์ํ๋ค.
์ต์ ๋ ๋ฐ์ธ๋ฉ
์ต์ ๋์ด๋ผ๋ ํฌ์ฅ์ง์์ ๊ฐ์ ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ๋ฐฐ์๋ณด์. ์ต์ ๋ ํด์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- ๋ช
์์ ํด์
- ๊ฐ์ ํด์
- ๋น๊ฐ์ ํด์ (์ต์ ๋ ๋ฐ์ธ๋ฉ)
- ๋ฌต์์ ํด์
- ์ปดํ์ผ๋ฌ์ ์ํ ์๋ ํด์
- ์ต์ ๋์ ๋ฌต์์ ํด์
โถ ๋ช ์์ ํด์
1) ๊ฐ์ ํด์ : ! (๋๋ํ) ์ฌ์ฉํ์ฌ ๊ฐ์ ํด์
์ต์ ๋๋ก ์ ์ธ๋ ๋ณ์ ๋ค์ ! ๋ฅผ ๋ถ์ฌ์ค๋ค.
var number: Int? = 3
print(number) // prints optional(3)
print(number!) // prints 3
!๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด, ์ต์ ๋ ํฌ์ฅ์ง๋ฅผ ๊ฐ์ ๋ก ๋ฒ๊ฒจ์ ๋์จ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ๋งค์ฐ ์ํํ๋ค. ๋ง์ฝ ํด๋น number๋ณ์๊ฐ nil๊ฐ์ ๊ฐ์ง๋ค๋ฉด, nil์ ๋๋ํ๋ฅผ ๋ถ์ด๊ฒ ๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด์ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์กฐ๊ธ ๋ ์์ ํ ๋ฐฉ์์ ๋ฌด์์ผ๊น? ๋ฐ๋ก ๋น๊ฐ์ ํด์ ์ต์ ๋ ๋ฐ์ธ๋ฉ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
2) ๋น๊ฐ์ ํด์ ์ต์ ๋ ๋ฐ์ธ๋ฉ : if let / guard let
๊ฐ์ ํด์ ๋ฐฉ์๋ณด๋ค ์์ ํ ๋ฐฉ์์ด๋ค.
if let result = number {
print(result)
} else {
// number๊ฐ nil์ด๋ผ์ ๊ฐ์ถ์ถ์ ์คํจํ๋ฉด ์ฌ๊ธฐ ์คํ
}
// prints 3
์ต์ ๋ ๋ฐ์ธ๋ฉ์ if๋ฌธ๊ณผ ๊ฐ์ ์กฐ๊ฑด์๋์ ์ต์ ๋ ํ์ ์ ๊ฐ์ ๋ณ์ ๋๋ ์์๋ฅผ ํ ๋นํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. if let ๋ง๊ณ guard let๋ ์กด์ฌํ๋ค.
func test() {
let number: Int? = 5
guard let result = number else { return }
print(result)
}
test()
// prints "5"
+ ๊ทธ๋ผ, if let ๊ณผ guard let์ ์ฐจ์ด์ ์ ๋ฌด์์ผ๊น? ์ธ์ ์ ์ ํ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊น?
if๋ฅผ ์ด์ฉํ์ฌ ์ต์
๋ ๋ฐ์ธ๋ฉ์ ํ๊ฒ ๋๋ฉด ์ต์
๋์ด ์ถ์ถ๋ ๋ณ์๋ ์์๋ฅผ if ๋ธ๋ก ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง guard ๋ฌธ์ ํ์ฉํ๋ฉด, guard๋ฌธ ๋ค์ ํจ์ ์ ์ฒด ๊ตฌ๋ฌธ์์ ์ต์
๋์ด ์ถ์ถ๋ ๋ณ์๋ ์์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
(guard๋ฌธ์ ์กฐ๊ฑด์ด ํธ๋ฃจ์ผ๋ guard๋ฌธ์ ํต๊ณผ์ํค๊ณ false์ด๋ฉด else๊ตฌ๋ฌธ์ ์คํํ ๋ค ํ๋ฆ์ ์ข
๋ฃ์ํจ๋ค. ์์ธํ ํด๋ฆญ)
โถ ๋ฌต์์ ํด์
1) ์ปดํ์ผ๋ฌ์ ์ํ ์๋ํด์ : ๋น๊ต์ฐ์ฐ์ ์ฌ์ฉ์ ์ต์ ๋ ์๋ ํด์
์ต์ ๋๊ฐ์ ๋น๊ต์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๋ค๋ฅธ๊ฐ๊ณผ ๋น๊ตํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์ต์ ๋์ ํด์ ์์ผ์ค๋ค. ๋ค์ ์ฝ๋๋ฅผ ๋ณด์.
let value: Int? = 6
if value == 6 {
print("value๊ฐ 6์
๋๋ค.")
} else {
print("value๊ฐ 6์ด ์๋๋๋ค.")
}
// prints "value๊ฐ 6์
๋๋ค."
์ด๋ ๊ฒ, ์ต์ ๋๊ฐ์ ๋น๊ต์ฐ์ฐ์๋ฅผ ํ์ฉํ๋ฉด ์๋์ผ๋ก ์ต์ ๋์ด ํด์ ๋๋ค.
2) ์ต์ ๋์ ๋ฌต์์ ํด์ : ! (๋๋ํ) ์ฌ์ฉํ์ฌ ๋ฌต์์ ์ต์ ๋ ํ์ ์ง์
์ด๋ ๊ฐ์ ์ฌ์ฉํ ๋ ์๋์ผ๋ก ์ต์ ๋์ด ํด์ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ๋ค์ ์ฝ๋๋ฅผ ๋ณด์.
let string = "12"
var stringToInt: Int! = Int(string)
// ๊ธฐ์กด์ ๋ฐฐ์ ๋ ์ต์
๋์ ? ์ด๋ค. ํ์ง๋ง !๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌต์์ ์ต์
๋ ํ์
์ด ๋๋ค.
print(stringToInt + 1)
// prints "13"
์ด๋ ๊ฒ ํ์ด์ฌ์ด๋ ๋ค๋ฅธ ์ธ์ด๋ง ๋ฐฐ์ ๋ ์ ์๊ฒ๋ ์กฐ๊ธ ์์ํ๋ ๊ฐ๋ ์ธ ์ต์ ๋์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ๋ค์์ ๊ตฌ์กฐ์ฒด์ ๊ด๋ จํ ๊ธฐ์ด ๋ฌธ๋ฒ์ ํฌ์คํ ํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
'Swift > Swift BASIC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ์ด๊ธฐํ ๊ตฌ๋ฌธ init / ์๋ฉธ์ deinit ์ด๋? (0) | 2022.01.17 |
---|---|
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - Struct์ Class (feat.์ฐจ์ด์ ) (0) | 2022.01.16 |
[Swift] ๊ธฐ๋ณธ ๋ฌธ๋ฒ - ๋ฐ๋ณต๋ฌธ (for, while, repeat-while) (0) | 2022.01.14 |
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - guard ๊ตฌ๋ฌธ (guard๋ฅผ ์ฌ์ฉํ๋ ์ด์ ) (2) | 2022.01.14 |
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ์กฐ๊ฑด๋ฌธ (if, switch ๊ตฌ๋ฌธ) (0) | 2022.01.14 |