ํฐ์คํ ๋ฆฌ ๋ทฐ
์์ฆ ๋งค์ผ ์ฑ ์์ ์์ ๊ณต๋ถ๋ฅผ ํ๋ค๊ณ ํ๋๋ฐ,
์ด๊ฒ๋ ํด์ผํ ๊ฒ ๊ฐ๊ณ , ์ ๊ฒ๋ ํด์ผํ ๊ฒ ๊ฐ์ ๋ง์์ ์๋ฃ๋ฅผ ์ฐพ๋ ๋ฐ์๋ง ๋ง์ ์๊ฐ์ ์ฐ๊ณ
์ ์ ์ ๋๋ก ๋ ๊ณต๋ถ๋ ๋ชปํ๊ณ ์๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๊ทธ๋์, ํ๋๋ฅผ ์ ํ๊ณ
์ฒ์๋ถํฐ ๋๊น์ง ์งํํด๋ณด๊ณ ์ ํฉ๋๋ค.
๊ณต๋ถํ ๊ฒ์ ๋ฐ๋ก, Swift ๋ฌธ๋ฒ์ ๋ํด์ ๊ณต๋ถํ๊ณ ์ถ์ด,
Swift ๊ณต์ ๋ถ์๋ฅผ ์ ๋ ํ๊ณ ์ ์ ํ์ต๋๋ค.
(๋ฌธ๋ฒ์ ๊ณ์ ๋ค์ ์ฐพ์๋ณด์๋.. ๋ค์ ์ ๋๋ก๋ ๊ณต๋ถ๋ฅผ ํ๊ณ ์ ํฉ๋๋ค.๐ญ)
์๋ง, ๋ค๋ฅธ ๊ฒ๋ค๋ ํจ๊ป ๊ณต๋ถ๋ฅผ ํ๊ณ ์์ด
์๋ ํ๋ ๊ฒ์ด ์ฝ์ง๋ ์๊ฒ ์ง๋ง, ๊พธ์คํ ๋ค! ์ฌ๋ ค๋ณด๊ฒ ์ต๋๋ค
์ด๋ฒ ๊ธ์ ์๋ Swift ๊ณต์ ๋ฌธ์์ ์ฒซ ๋ฒ์งธ ๋จ์์ธ <The Basics>๋ฅผ ๋ณด๊ณ
์ ์ฒด์ ์ธ ๋ด์ฉ๊ณผ ์ ์ ์๊ฐ์ ๊ธฐ๋กํด๋ณด๋ ค ํฉ๋๋ค.
Swift ๊ณต์ ๋ฌธ์ <The Basics>
์ค๊ฐ ์ค๊ฐ ์ ์ ์๊ฐ์ด ํฌํจ๋ ์ ์์ด
ํน์๋ ์๋ชป๋ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ํ์ ๋ถํ๋๋ฆฝ๋๋ค. ๐ค๐ค๐ค
Swift๋ ๋ค์ํ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ ์ ๊ณตํฉ๋๋ค.
- ์ ์์ ๋ํ Int
- ๋ถ๋ ์์์ ๊ฐ์ ๋ํ Double
- ๋ถ๋ฆฐ ๊ฐ(์ฐธ, ๊ฑฐ์ง)์ ์ํ Bool
- ํ ์คํธ์ ๋ํ String
- Collection Type (Array, Set, Dictionary)
Swift๋ ๊ตฌ๋ถ๋๋ ์ด๋ฆ์ผ๋ก ๊ฐ์ ์ ์ฅํ๊ณ ์ฐธ์กฐํ๊ธฐ ์ํด ๋ณ์(Variables)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ํ, ๊ฐ์ด ๋ณํ์ง ์๋ ์์(Constansts)๋ฅผ ์ฌ์ฉํ์ฌ, ์์ ์ ํ ๋ ๋ ์์ ํ๊ณ ๋ถ๋ช ํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๋, ํํ(Tuple)๊ณผ ๊ฐ์ด ๋ ๋ฐ์ ๋ ํ์ ์ ๋์ ํ์ต๋๋ค.
ํํ์ ์ฌ๋ฌ ๊ฐ๋ค์ ๊ทธ๋ฃนํํ์ฌ ๋ง๋ค๊ณ , ์ ๋ฌํ ์ ์์ต๋๋ค. ๋ํ ํจ์์์ ๋ค์ํ ๊ฐ๋ค์ ๋จ์ผ ๋ณตํฉ ๊ฐ์ผ๋ก ๋ฆฌํดํ ์ ์์ต๋๋ค.
(โ๏ธ์ฌ๋ฌ ๊ฐ๋ค์ ํ๋์ ๋ฐ์ดํฐ ๋ฌถ์์ผ๋ก ์ ๋ฌํ ์ ์๋ค๋ ๋ง์ ๋๋ค!)
Swift๋ ๊ฐ์ด ์กด์ฌํ์ง ์์์ ๋ค๋ฃจ๊ธฐ ์ํด ์ต์ ๋ ํ์ (Opteional Type)์ ๋์ ํ์ต๋๋ค.
์ต์ ๋์ '๊ฐ์ด ์๊ณ , x์ ๊ฐ๋ค' ๋๋ '๊ฐ์ด ์๋ค'๋ฅผ ์๋ ค์ค๋๋ค.
Swift๋ ํ์ -์ธ์ดํ (type-safe)์ธ์ด์ ๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์์ ํ๋ ์ฝ๋์์ ๋ค๋ฃจ๋ ๊ฐ๋ค์ ํ์ ์ ๋ถ๋ช ํ ํ๋๋ฐ ๋์์ ์ค๋ค๋ ์๋ฏธ์ ๋๋ค..
๋ง์ฝ, ์ฝ๋์์ String์ ์๊ตฌํ๋ค๋ฉด, ํ์ ์ธ์ดํ๋ ์ฐ๋ฆฌ๊ฐ ์ค์๋ก Intํ์ ์ ์ ๋ฌํ๋ ๊ฒ์ ๋ง์์ค๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ํ์ ์ธ์ดํ๋ ์ฐ๋ฆฌ๊ฐ ์ต์ ๋์ด ์๋ String์ ์๊ตฌํ๋ ์ฝ๋์ ์ต์ ๋ Stirng์ ์ ๋ฌํ๋ ค๊ณ ํ๋ ๊ฒ์ ๋ง์์ค๋๋ค.
ํ์ ์ธ์ดํ๋ ๊ฐ๋ฐ ๋จ๊ณ์์ ๊ฐ๋ฅํ ๋น ๋ฅด๊ฒ ์๋ฌ๋ฅผ ์ฐพ๊ณ ๊ณ ์น ์ ์๊ฒ ๋์์ค๋๋ค.
์์์ ๋ณ์ (Constants and Variables)
์์์ ๋ณ์๋ ์ด๋ฆ(maximumNumberOfLoginAttempts ๋๋ welcomeMessage)๊ณผ
ํน์ ํ์ (์ซ์ 10 ๋๋ ๋ฌธ์์ด "Hello"์ ๊ฐ์ ํ์ )์ ๊ฐ์ ์ฐ๊ฒฐํฉ๋๋ค.
์์์ ๊ฐ์ ํ ๋ฒ ์ค์ ๋๋ฉด ๋ฐ๊ฟ ์ ์์ง๋ง, ๋ฐ๋ฉด์ ๋ณ์๋ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํฉ๋๋ค.
let maximumNumberOfLoginAttempts = 10
var wellcomeMessage = "Hello
์์์ ๋ณ์ ์ ์ธ (Declaring Constants and Variables)
์์์ ๋ณ์๋ ์ฌ์ฉ ์ ์ ์ ์ธ์ด ๋์ด์ผ ํฉ๋๋ค.
์์๋ let ํค์๋๋ก, ๋ณ์๋ var ํค์๋๋ก ์ ์ธํ ์ ์์ต๋๋ค.
์๋ ์์๋ ์์์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ป๊ฒ ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์๋ ํ์๋ฅผ ์ถ์ ํ๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0
์ด ์ฝ๋๋ 'maximumNumberOfLoginAttempts'์ธ ์๋ก์ด ์์๋ฅผ ์ ์ธํ๊ณ 10์ด๋ผ๋ ๊ฐ์ ์ ๋ฌํ๊ณ ,
'currentLoginAttempt'์ธ ์๋ก์ด ๋ณ์๋ฅผ ์ ์ธํ๊ณ 0์ด๋ผ๋ ๊ฐ์ผ๋ก ์ ๋ฌ ํฉ๋๋ค.
๋ณ์๋ ์์๋ฅผ ์ ์ธํ ๋, ๊ฐ์ ์ ์ธ๋ถ์์ ๋ฃ์ด์ค ์๋ ์์ง๋ง,
์๋ 'maximumNumberOfLoginAttemps'์ฒ๋ผ ์ด๊ธฐ ๊ฐ์ ๋์ค์ ํ ๋นํ ์๋ ์์ต๋๋ค.
var environment = "development"
let maximumNumberOfLoginAttempts: Int
// maximumNumberOfLoginAttempts has no value yet.
์ปด๋ง(,)๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์์๋ ๋ณ์๋ฅผ ํ ์ค์ ์ ์ธํ ์ ์์ต๋๋ค.
var x = 0.0, y = 0.0, z = 0.0
ํ์ ๋ช ์ (Type Annotaions)
๋ณ์๋ ์์๋ฅผ ์ฌ์ฉํ ๋ type annotaion์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ์ ์ ์ฅํ๋ ๋ณ์๋ ์์์ ํ์ ์ ๋ถ๋ช ํ๊ฒ ํด์ค๋๋ค.
์ฝ๋ก (:)์ ๋ณ์๋ ์์ ์ด๋ฆ ๋ค์ ๋๊ณ , ํ ์นธ ๋๊ณ ์ฌ์ฉํ ํ์ ์ ์ด๋ฆ์ ์ฐ๋ฉด ๋ฉ๋๋ค.
(โ๏ธ์ด๊ฑด ์ฝ๋ ๊ท์น์ ๋๋ค)
var welcomeMessage: String
์๋ ์ฝ๋๋ ์๋ฌ์์ด ํน์ Stirng ๊ฐ์ ๋ฃ์ด์ค ์ ์์ต๋๋ค.
(โ๏ธ์์์ ํ์ ์ ๋ช ์ํด์ฃผ๊ณ , ๋ณ์๋ฅผ ์ ์ธํ๊ธฐ ๋๋ฌธ์ ๋๋ค.)
welcomeMessage = "Hello"
๊ฐ์ ํ์ ์ ์ฌ๋ฌ ๋ณ์์ ๊ฒฝ์ฐ ์ฝค๋ง(,)๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ค๋ก ์ ์ธ ๊ฐ๋ฅํฉ๋๋ค.
var red, green, blue: Double
ํ์ง๋ง, ์ค์ ์์ ์ฐ๋ฆฌ๊ฐ type annotaion์ ์ฌ์ฉํ๋ ์ผ์ ๊ฑฐ์ ์์ต๋๋ค.
์ด๊ธฐ์ ๋ณ์๋ ์์๋ฅผ ์ ์ธํ๋ฉด์ ์ด๊ธฐ ๊ฐ์ ์ ๋ฌํด์ค๋ค๋ฉด, Swift๋ ํ์ ์ ์ถ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ๋ค์์ ๋ ์์ธํ ๋ณด๊ฒ ์ต๋๋ค.
์์ ์์์ ๊ฒฝ์ฐ ์ ์ธ ๋ถ์์ ์ด๊ธฐ ๊ฐ์ ๋ฃ์ด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ type anootation์ ์ฌ์ฉํ ๊ฒ๋๋ค.
(โ๏ธ๋ค์ ๋งํด, ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด type annotation ์์ด ์ฝ๋๋ฅผ ์์ฑํด๋ ๋๋ค๋ ๋ง์ ๋๋ค.)
var welcomeMessage = "Hello"
์์์ ๋ณ์์ ์ด๋ฆ ์ง๊ธฐ (Naming Constants and Variables)
์์์ ๋ณ์ ์ด๋ฆ์ ์ ๋ ์ฝ๋(Unicode)๋ฌธ์๋ฅผ ํฌํจํ์ฌ ๋๋ถ๋ถ์ ๋ฌธ์๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
(โ๏ธํ์, ์ด๋ชจํฐ์ฝ, ํ์ด ๋ฑ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.)
let π = 3.14159
let ไฝ ๅฅฝ = "ไฝ ๅฅฝไธ็"
let ๐ถ๐ฎ = "dogcow"
์์์ ๋ณ์ ์ด๋ฆ์ ๊ณต๋ฐฑ, ์ํ์ ๊ธฐํธ, ํ์ดํ, ๋ด๋ถ์์ ์ฌ์ฉํ๋ ์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ, ๋๋ ์ ๊ณผ ๋ฐ์ค๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฌธ์๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
์ซ์๋ ์ด๋ฆ์ ๋ค๋ฅธ ๊ณณ์๋ ํฌํจ๋ ์ ์์ง๋ง ์ซ์๋ก ์์ํ๋ ์ด๋ฆ์ ์ ์ธํ ์๋ ์์ต๋๋ค.
Swift ํค์๋์ ๋์ผํ ์ด๋ฆ์ ์์ ๋๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, ๋ฐฑํฑ(`)์ผ๋ก ๋ฌถ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ํ์ ์ฌ์ง๊ฐ ์์ ๋๊น์ง๋ ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฉ๋๋ค.
(โ๏ธSwift์์ ์์ฒด์ ์ผ๋ก ์ ํด๋ ํค์๋(์๋ฅผ ๋ค์ด var, let)์ ๋ณ์๋ ์์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ ์ด์ผ ๋ฉ๋๋ค.)
(โ๏ธํน์๋ ๋ฐฑํฑ์ด ๋ญ์ง ๋ชจ๋ฅด์๋ ๋ถ๋ค์ ์ํด.. ํค๋ณด๋์์ โฉ๋ฅผ ์ฐพ์ผ์ ๋ค, ์๋ฌธ ํค๋ก ๋ฐ๊ฟ์ ํด๋น ํค๋ฅผ ๋๋ฅด๋ฉด ๋ฐฑํฑ(`)์ด ๋์ต๋๋ค!)
var `var` = "var"
let `let` = "let"
print(`var`)
print(`let`)
/* - ์ถ๋ ฅ
var
let
*/
๋ณ์๋ ์ด๊ธฐ๊ฐ์ ๊ฐ์ ํ์ ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ ์์ง๋ง, ์์๋ ๋ฐ๊พธ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
// friendlyWelcome is now "Bonjour!"
let languageName = "Swift"
languageName = "Swift++"
// This is a compile-time error: languageName cannot be changed.
๋ณ์์ ์์ ํ๋ฆฐํธํ๊ธฐ (Printing Constants and Variables)
์์์ ๋ณ์์ ํ์ฌ ๊ฐ์ print(_:separator:terminator:) ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฆฐํธ ํ ์ ์์ต๋๋ค.
print(friendlyWelcome)
// Prints "Bonjour!"
print ํจ์๋ Xcode์ "console"์ฐฝ์ ํ๋ ์ด์์ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฆฐํธ ํด์ฃผ๋ ํจ์์ ๋๋ค.
separator์ terminator๋ default ๊ฐ์ด ์์ด ํจ์ ํธ์ถ ์ ๊ฐ์ ๋ฃ์ง ์์๋ ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
terminator์ default ๊ฐ์ผ๋ก ์ธํด, ํ๋ฆฐํธ๊ฐ ๋๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ค ๋ฐ๊ฟ์ด ๋ฉ๋๋ค.
์ด๋ฅผ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด ํ๋ผ๋ฏธํฐ์ ์ง์ ๊ฐ์ ๋ฃ์ด์ ์คํํ๋ฉด ๋ฉ๋๋ค.
print("Hello", terminator: " ") // ํ ์นธ ๋์ด์ฐ๊ธฐ๋ง ํ๊ณ print๋ฌธ์ ์ข
๋ฃํ๋ค.
print("Leo")
/* - ์ถ๋ ฅ
Hello Leo
*/
Swift๋ ๋ณ์๋ ์์์ ์ด๋ฆ์ ๊ฐ์ผ๋ก ๋์ฒดํ์ฌ ํ์ํ๊ธฐ ์ํด ๋ฌธ์์ด ๋ณด๊ฐ๋ฒ(Stirng Interploation)์ ์ฌ์ฉํฉ๋๋ค.
(โ๏ธ๋ณ์๋ ์์์ ์ด๋ฆ์ \()์ ๊ดํธ ์ฌ์ด์ ์์ฑํ๋ฉด, ํด๋น ์๋ฆฌ์ ๋ณ์๋ ์์ ์ด๋ฆ์ ์ ์ฅ๋์ด ์๋ ๊ฐ์ผ๋ก ๋์ฒด๋์ด ํ๋ฆฐํธ๋ฉ๋๋ค.)
print("The current value of friendlyWelcome is \(friendlyWelcome)")
// Prints "The current value of friendlyWelcome is Bonjour!"
์ฃผ์ (Comments)
์ฝ๋์์ ์คํ๋์ง ์๋ ํ ์คํธ๋ฅผ ํฌํจํ๊ธฐ ์ํด ์ฃผ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฝ๋๊ฐ ์ปดํ์ผ๋ ๋, ์ฃผ์์ ๋ฌด์๋ฉ๋๋ค.
ํ ์ค ์ฃผ์์ //์ ์ฌ์ฉํฉ๋๋ค.
// This is a comment.
์ฌ๋ฌ ์ค์ ์ฃผ์์ \*, *\ ์ฌ์ด์ ์์ฑํฉ๋๋ค.
/* This is also a comment
but is written over multiple lines. */
C์ธ์ด์๋ ๋ค๋ฅด๊ฒ, ์ฃผ์ ์์ ๋ค๋ฅธ ์ฃผ์์ ์ค์ฒฉํ ์ ์์ต๋๋ค.
/* This is the start of the first multiline comment.
/* This is the second, nested multiline comment. */
This is the end of the first multiline comment. */
(โ๏ธ์ฌ์ค ์ด๊ฑธ ์ธ์ ์ธ๊น ์ถ์์ง๋ง, ์๋ฅผ ๋ค์ด, ํจ์ ๋ด๋ถ ์ค๊ฐ ์ฏค ์ฃผ์์ผ๋ก ์ฝ๋ ์ค๋ช ์ด ์จ์๋๋ฐ, ์ฃผ์ ์ ๋ค๋ก ์ ๊น ๋ค๋ฅธ ์ฝ๋๋ค์ ์ฃผ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ถ์๋ ์์ฃผ ์ ์ฉํ๊ฒ ํ ๋ฒ์ ๋๋๊ทธํด์ ์ฌ์ฉํ ์ ์๋ ๊ฒ๋๋ค!!)
(โ๏ธ ์ถ๊ฐ ๊ฟํ, ์ฃผ์ ์ฒ๋ฆฌํ๊ณ ์ถ์ ์ฝ๋๋ฅผ ํ ๋ฒ์ ๋๋๊ทธ ํ๊ณ cmd +/ ๋๋ฅด๋ฉด ํ ๋ฒ์ ์ฃผ์ ์ฒ๋ฆฌ ๋ฉ๋๋ค~)
์ธ๋ฏธํด๋ก (Semicolons)
๋ค๋ฅธ ์ธ์ด์ ๋ฌ๋ฆฌ, Swift๋ ์ฝ๋ ๋ฌธ์ฅ ๋ง์ง๋ง์ ์ธ๋ฏธํด๋ก (;)์ ์๊ตฌํ์ง ์์ต๋๋ค.
๋ง์ฝ ํ ์ค์ ์ฌ๋ฌ ์คํ๋ฌธ์ ์ฐ๊ณ ์ถ๋ค๋ฉด ์ธ๋ฏธํด๋ก ์ผ๋ก ๊ตฌ๋ถํ๋ฉด ๋ฉ๋๋ค.
let cat = "๐ฑ"; print(cat)
// Prints "๐ฑ"
์ ์ (Integers)
์ ์๋ 42์ -23๊ณผ ๊ฐ์ด ๋ถ์๊ฐ ์๋ ์ ์ฒด ์ซ์์ ๋๋ค. ๋ํ, ๋ถํธ๊ฐ ์๋ ์ ์ (signed) (์์, 0, ๋๋ ์์) ๋๋ ๋ถํธ๊ฐ ์๋ ์ ์ (unsigned) (์์ ๋๋ 0)์ด ์์ต๋๋ค.
Swift๋ 8, 16, 32, 64๋นํธ ํ์์ ์ ์๋ฅผ ์ ๊ณตํ๊ณ , C์ ์ ์ฌํ๊ฒ 8๋นํธ์ ๋ถํธ ์๋ ์ ์๋ UInt8, 32๋นํธ์ ๋ถํธ ์๋ ์ ์๋ Int32๋ก ํ์ํฉ๋๋ค. Swift์ ๋ชจ๋ ํ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ ํ์ ๋ ๋๋ฌธ์๋ก ์์ํฉ๋๋ค.
(โ๏ธ๋ถํธ๊ฐ ์๋ ์ ์๋ UInt๋ก ํ์, ๋ถํธ๊ฐ ์๋ค๋ฉด Int๋ก ํ์ํ๊ณ , ๋ค์ ๋นํธ ์๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋ฉ๋๋ค.)
์ ์ ๋ฒ์ (Integer Bounds)
๊ฐ ์ ์ ํ์ ์ max, minํ๋กํผํฐ๋ฅผ ์ด์ฉํ์ฌ ์ต์ ๊ฐ๊ณผ ์ต๋ ๊ฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8
Int
๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๊ฐ ์ฝ๋์์ ์ฌ์ฉํ๋ ์ ์์ ์ฌ์ด์ฆ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ ํ ํ์๋ ์์ต๋๋ค.
Swift์์ ํ์ฌ ๋ค์ดํฐ๋ธ ํฌ๊ธฐ์ ๊ฐ์ ์ฌ์์ฆ์ Intํ์ ์ ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- 32-bit ํ๋ซํผ์์ Int ๋ Int32 ์ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ต๋๋ค.
- 64-bit ํ๋ซํผ์์ Int ๋ Int64 ์ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ตฌ์ฒด์ ์ธ ์ฌ์ด์ฆ์ ์ ์๋ก ์์ ์ํด์ผํ๋ ๊ฒ ์๋๋ผ๋ฉด, ๊ทธ๋ฅ Intํ์ ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
32-bitํ๋ซํผ์์ ์ฌ์ฉ๋๋ Int(Int32)๋ -2,147,483,648 ~ 2,147,483,647 ์ฌ์ด์ ๊ฐ์ ์ ์ฅํ ์ ์์ผ๋ฏ๋ก ์ถฉ๋ถํ ํฐ ๊ฐ์ ์ ์ฅํ ์ ์์ต๋๋ค.
(โ๏ธ์ 32๋นํธ๊ฐ ์ ๋ฐ ์ซ์๋ฅผ ํํํ ์ ์๋ ์ง ๊ถ๊ธํ์๋ค๋ฉด, ๋ฉ๋ชจ๋ฆฌ์ ์ด์ง๋ฒ์ ๋ํด์ ์ฐพ์๋ณด์ธ์!!)
UInt
Swift๋ ๋ถํธ๊ฐ ์๋ ์ ์, UInt ํ์ ์ ์ ๊ณตํฉ๋๋ค. ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ซํผ์ ๋ฐ๋ผ ์์์ ์ฌ์ด์ฆ๊ฐ ์ ํด์ง๋๋ค.
โญ๏ธ UInt๊ฐ ํน๋ณํ๊ฒ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด, ์์๋ก ์๋ ค์ง ๊ฐ์ด ์ ์ฅ๋๋๋ผ๋ Int๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Int ํ์ ์ ์ผ๊ด๋ ์ฌ์ฉ์ ์ฝ๋ ์ํธ ์ด์ฉ์ฑ(interoperability)๋ฅผ ์ง์ํ๊ณ , ๋ค๋ฅธ ์ซ์ ํ์ ์ผ๋ก ๋ณํํ ํ์๊ฐ ์์ต๋๋ค.
(โ๏ธ์ํธ ์ด์ฉ์ฑ์ ํน๋ณํ ๋ ธ๋ ฅ ์์ด๋ ์ํธ ๊ฐ์ ๊ตํ์ ํจ๊ณผ์ ์ผ๋ก ํ ์ ์๊ฒ ํ๋ ๋ฅ๋ ฅ์ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋๋ถ๋ถ์ด Int ํ์ ์ ์ฌ์ฉํ๋๋ฐ ํผ์ Int8 ํ์ ์ ์ฌ์ฉํ๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๊ณผ์ ์ํํ ํ์ ์ ํ์ง ๋ชปํ๋ฉฐ, ์ด๋ ์ํธ ์ด์ฉ์ฑ์ด ๊นจ์ก๋ค๊ณ ํํํ ์ ์์ต๋๋ค.)
(โ๏ธ๋ ์ฝ๊ฒ ์ค๋ช ํ์๋ฉด, ๋๋ถ๋ถ์ด Int ์ฐ๋๊น ๋๋ Int ์จ! ๋ผ๊ณ ๋งํ๋ ๊ฒ์ ๋๋ค.)
๋ถ๋ ์์์ ์ซ์(Floating-Point Numbers)
๋ถ๋ ์์์ ์ซ์๋ 3.141592, 0.1, -231.13์ ๊ฐ์ ๋ถ์ ์ฑ๋ถ์ ๊ฐ๋ ์ซ์์ ๋๋ค.
Int ํ์ ์ ๊ฐ๋ณด๋ค ๋ ๋์ ๋ฒ์์ ๊ฐ์ ํํํ ์ ์๊ณ , ๋ ํฌ๊ณ ์์ ๊ฐ์ ์ ์ฅํ ์ ์์ต๋๋ค.
Swift๋ Double๊ณผ Float์ ๋ ๊ฐ์ง ๋ถ๋ ์์์ ํ์ ์ ์ ๊ณตํ๊ณ ,
Double์ 64๋นํธ์ ๋ถ๋ ์์์ ์ซ์, Float๋ 32๋นํธ์ ๋ถ๋ ์์์ ์ซ์๋ฅผ ํํํฉ๋๋ค.
Double ํ์ ์ ์ต์ 15์๋ฆฌ์ ์์์ ์ ํ๋๋ฅผ ๊ฐ๊ณ , Float ํ์ ์ ์ต์ 6์๋ฆฌ์ ์์์ ์ ํ๋๋ฅผ ๊ฐ์ต๋๋ค.
var b: Float = 3.123456//์ค์, ๋ถ๋์์(6์๋ฆฌ):
var c: Double = 3.123456789012345//์ค์, ๋ถ๋์์(15์๋ฆฌ)
print(b)
print(c)
(โ๏ธ๋ ์ฐ๋ฉด ์ด๋ป๊ฒ ๋์ค๋ ๊ถ๊ธํด์, playground์์ ์ง์ ํ๋ฆฐํธ ํด๋ดค๋๋ฐ..
์ ์ํ์์ ๋ค์ ์ซ์๋ฅผ ๋ ์ด ๋ค ํ๋ฆฐํธ๋ฅผ ํ๋ฉด, ์์์ ๋ค๋ก 7, 16์๋ฆฌ๊น์ง ๋ณด์ด์ง๋ง, ๋งจ ๋ค์ ์ซ์๋ ์ ํํ์ง ์์ต๋๋ค!)
์ํฉ์ ๋ฐ๋ผ ๋ ๊ฐ์ ๋ถ๋ ์์์ ํ์ ์ค ์ ์ ํ ๊ฒ์ ๊ณจ๋ผ์ผ ํ๊ฒ ์ง๋ง, ๋ ๋ค ๊ด์ฐฎ๋ค๋ฉด Double์ ์ฌ์ฉํฉ๋๋ค.
ํ์ ์ธ์ดํํฐ์ ํ์ ์ถ๋ก (Type Safety and Type Inference)
Swift๋ ํ์ ์ธ์ดํ(type-safe) ์ธ์ด์ ๋๋ค. ์ฝ๋๋ฅผ ์ปดํ์ผ ํ ๋ ํ์ ๊ฒ์ฌ๋ฅผ ํ๊ณ ์ผ์นํ์ง ์๋ ํ์ ์ ์ค๋ฅ๋ก ํ์๋ฅผ ํด์ค๋๋ค.
์ด๋ฅผ ํตํด ๊ฐ๋ฐ ๋จ๊ณ์์ ๊ฐ๋ฅํ ๋นจ๋ฆฌ ์ค๋ฅ๋ฅผ ์ฐพ๊ณ ์์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ ์ธํ๋ ๋ชจ๋ ์์์ ๋ณ์์ ํ์ ์ type-annotaion์ผ๋ก ์ง์ ํด์ค์ผ ํ๋ค๋ ๊ฒ์ ์๋๋๋ค.
Swift๋ ํ์ํ ๊ฐ์ ํน์ ํ์ ์ด ์ง์ ๋์ด ์์ง ์๋ค๋ฉด ์ ์ ํ ํ์ ์ถ๋ก (Type inference)์ ์ฌ์ฉํฉ๋๋ค.
ํ์ ์ถ๋ก ์ ํตํด ์ฝ๋๋ฅผ ์ปดํ์ผ ํ ๋ ์ ๊ณตํ ๊ฐ์ ๊ฒ์ฌํ์ฌ ํน์ ์์ ํ์ ์ ์๋์ผ๋ก ์ถ๋ก ํ ์ ์๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ Swift๋ C๋ Objective-C์ ๊ฐ์ ์ธ์ด๋ณด๋ค ํ์ ์ ์ธ์ ๋ ์ ๊ฒ ์๊ตฌํฉ๋๋ค.
์๋ฅผ ๋ค์ด, 42์ ๊ฐ์ ํ์ ์ ์ธ ์์ด ๋ฆฌํฐ๋ด ๊ฐ๋ง ํ ๋นํด์ค๋ค๋ฉด Swift๋ type infernce๋ฅผ ํตํด Intํ์ผ๋ก ์ถ๋ก ์ ํฉ๋๋ค.
let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int
๋ง์ฐฌ๊ฐ์ง๋ก, ํน๋ณํ๊ฒ ํ์ ๋ช ์๊ฐ ์์ง๋ง, ์์์ Double๋ก ์ถ๋ก ํฉ๋๋ค.
(โ๏ธ Float ํ์ ์ผ๋ก ์ถ๋ก ํ ์๋ ์๊ฒ ์ง๋ง, ์๊น ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ Swift๋ ์ํธ ์ด์ฉ์ฑ์ ์ํด Double ํ์ ์ ์ฆ๊ฒจ ์ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.)
let pi = 3.14159
// pi is inferred to be of type Double
์ ์์ ๋ถ๋ ์์์ ์ ๋ํ๋ ํํ์์ ์จ๋, ๋ค์ ๋ถ๋ ์์์ ์ ๋ณด๊ณ Double ํ์ ์ผ๋ก ์ถ๋ก ํฉ๋๋ค.
๋ค์ ๋งํด, ํํ์์ ๊ฒฐ๊ณผ (output)์ ๋ณด๊ณ ํ์ ์ ์ถ๋ก ํฉ๋๋ค.
let anotherPi = 3 + 0.14159
// anotherPi is also inferred to be of type Double
์ซ์ ๋ฆฌํฐ๋ด (Numeric Literals)
์ ์ ๋ฆฌํฐ๋ด์ ์๋์ ๊ฐ์ด ์ธ ์ ์์ต๋๋ค.
-
0์ง์๋ ์ ๋์ฌ ์์ด ํํ
-
2์ง์๋ 0b๋ฅผ ์ ๋์ฌ๋ก ํํ (b = binary)
-
8์ง์ 0o๋ฅผ ์ ๋์ฌ๋ก ํํ (o = octal)
-
16์ง์ 0x๋ฅผ ์ ๋์ฌ๋ก ํํ (x = hexadecimal)
let decimalInteger = 17
let binaryInteger = 0b10001 // 17 ์ 2์ง์๋ก ํํ
let octalInteger = 0o21 // 17 ์ 8์ง์๋ก ํํ
let hexadecimalInteger = 0x11 // 17 ์ 16์ง์๋ก ํํ
๋ถ๋ ์์์ ๋ฆฌํฐ๋ด์ ์๋์ ๊ฐ์ด ํํ๋ฉ๋๋ค.
- 10์ง์๋ ์ ๋์ฌ ์์ด ํํ
- e,E๋ก ์ง์๋ฅผ ํ์ (์ง์๊ฐ x์ธ 10์ง์๋ 10^๊ฐ ๊ณฑํด์ง)
- 1.25e2 = 1.25 x 10²
- 16์ง์๋ 0x๋ฅผ ์ ๋์ฌ๋ก ํํ
- p, P๋ก ์ง์๋ฅผ ํ์ (์ง์๊ฐ x์ธ 16์ง์๋ 2^๊ฐ ๊ณฑํด์ง)
- 0xFp2 = 15 x 2²
์๋๋ ๋ชจ๋ 12.1875๋ฅผ ํํํ๋ ๋ฆฌํฐ๋ด์ ๋๋ค.
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
์ซ์ ๋ฆฌํฐ๋ด์ ์ฝ๊ธฐ ์ฝ๊ฒ ํํํ๊ธฐ ์ํด ์ถ๊ฐ ํฌ๋งท์ ํฌํจํ ์ ์์ต๋๋ค.
์ ์์ ๋ถ๋ ์์์ ๋ชจ๋ ์ถ๊ฐ์ ์ธ 0์ผ๋ก ์ฑ์์ง ์ ์๊ณ , ๊ฐ๋ ์ฑ์ ์ํ ๋ฐ์ค์ ํฌํจํ ์ ์์ต๋๋ค.
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
(โ๏ธ์ด ๋ถ๋ถ์ ์ธ์ด๋ค๊ธฐ๋ณด๋ค.. ํ์ํ ๋๋ง๋ค ๋ค์ ๋ด์ผํ ๋ฏ ํฉ๋๋ค ๐ )
์ซ์ ํ์ ๋ณํ (Numeric Type Conversion)
์์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ ์์์ ๋ณ์๊ฐ ์ ์๋ก ์ฌ์ฉ์ด ๋๋ฉด Int ํ์ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ ์ฝ๋์์ ์ฆ์ ์ํธ ์ด์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ ์ ๋ฆฌํฐ๋ด ๊ฐ์ ์ ์ถ๋ ํ์ ์ด ์ผ์นํ ๊ฒ์ ๋๋ค.
์ธ๋ถ ์์ค์์ ํน๋ณํ ์ฌ์ด์ฆ๊ฐ ์ง์ ๋ ๋ฐ์ดํฐ๋ ์ ์, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ, ๋๋ ์ต์ ํ๊ฐ ํ์ํ ํน๋ณํ ๊ฒฝ์ฐ์๋ง ๋ค๋ฅธ ์ ์ ํ์ ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฌํ ์ํฉ์์ ์ฌ์ด์ฆ๊ฐ ์ง์ ๋ ํ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ํน์ ์ฌ๊ฑด์ผ๋ก ์ธํ ๊ฐ์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํฌ์ฐฉํ๊ณ , ์ฌ์ฉ์ค์ธ ๋ฐ์ดํฐ์ ํน์ฑ์ ์ ์ ์์ต๋๋ค.
์ ์ ๋ณํ (Integer Conversion)
์ ์๋ฅผ ์ ์ฅํ ์ ์๋ ์์ ๋๋ ๋ณ์์ ์ซ์ ๋ฒ์๋ ๊ฐ ์ซ์ ํ์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
Int8 ์์ ๋๋ ๋ณ์๋ -128 ๊ณผ 127 ์ฌ์ด์ ์ซ์๋ฅผ ์ ์ฅํ ์ ์์ง๋ง, UInt8 ์์ ๋๋ ๋ณ์๋ 0 ๊ณผ 255 ์ฌ์ด์ ์ซ์๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ํฌ๊ธฐ๊ฐ ์ง์ ๋ ์ ์ ํ์ ์ ์์ ๋๋ ๋ณ์์ ๋ง์ง์๋ ์ซ์๋ ์ปดํ์ผ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
let cannotBeNegative: UInt8 = -1
// UInt8 can't store negative numbers, and so this will report an error
let tooBig: Int8 = Int8.max + 1
// Int8 can't store a number larger than its maximum value,
// and so this will also report an error
๊ฐ ์ซ์ ํ์ ์ ๋ค๋ฅธ ๋ฒ์์ ๊ฐ์ ์ ์ฅํ ์ ์์ผ๋ฏ๋ก ์ซ์ ํ์ ๋ณํ์ ๊ฐ ํ์ ๋ณ๋ก ์งํํด์ผ ํฉ๋๋ค.
์ด๋ ์จ๊ฒจ์ง ํ์ ๋ณํ ์๋ฌ๋ฅผ ๋ง๊ณ ํ์ ์ ํ ์๋๋ฅผ ๋ช ์ํ๋๋ฐ ๋์์ ์ค๋๋ค.
ํน์ ์ซ์ ํ์ ์ ๋ค๋ฅธ ํ์ ์ผ๋ก ๋ณํํ๋ ค๋จผ ์ํ๋ ํ์ ์ ์ ์ซ์๋ก ์ด๊ธฐํ ํด์ผ ํฉ๋๋ค.
(โ๏ธ ๊ธฐ์กด์ ์๋ ์ซ์์ ํ์ ์ change ํ๋๊ฒ ์๋๋ผ, ์์ ํ ์๋ก์ด ์ซ์๋ฅผ ๋ง๋ค์ด ๋ธ๋ค๋ ์๋ฏธ์ ๋๋ค!)
UInt16 ํ์ ๊ณผ UInt8 ํ์ ์ ๊ฐ๋ค์ ํจ๊ป ๋ํด์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์ UInt8์ ๊ฐ์ธ 1์ UInt16 ํ์ ์ผ๋ก ์๋กญ๊ฒ ์ด๊ธฐํ ํด์ ๊ณ์ฐ์ ์งํํด์ผ ํฉ๋๋ค. ๊ณ์ฐ์ ๊ฒฐ๊ณผ์ธ twoThousandAndOne ์์๋ ํ์ ์ถ๋ก ์ ์ํด UInt16 ํ์ ์ด ๋ฉ๋๋ค.
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
SomeType(ofInitialValue)๋ Swift ํ์ ์ ์์ฑ์๋ฅผ ํธ์ถํ๊ณ ์ด๊ธฐ ๊ฐ์ ์ ๋ฌํด์ฃผ๋ ๊ฒ ์ ๋๋ค.
(โ๏ธ๋ค์ ๋งํด, ํน์ ํ์ ์ ๊ฐ์ ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ํด์ฃผ๋ฉด ํด๋น ํ์ ์ ์์ฑ์๊ฐ ์๋ก์ด ๊ฐ์ ์์ฑํด๋ด๋ ๊ฒ ์ ๋๋ค.)
any type์ ์ ๋ฌํ ์ ์์ง๋ง, ํ์ฅ์ ํตํด ๊ตฌํํด์ค๋ค๋ฉด ์ปค์คํ ํ์ ์ผ๋ก๋ ํด๋น ํ์ ์ ๊ฐ์ ์ด๊ธฐํํ ์ ์์ต๋๋ค.
(โ๏ธ์ด ๋ด์ฉ์ ๋ค์ ๋ด์ฉ์ ์๋ฉด ์ดํด๊ฐ ๋์ค๊ฑฐ์์.)
์ ์์ ๋ถ๋ ์์์ ๋ณํ (Integer and Floating-Point Conversion)
์ ์์ ๋ถ๋ ์์์ ์ซ์ ํ์ ์ ๋ณํ์ ๋ช ์์ ์ผ๋ก ์์ฑ๋์ด์ผ ํฉ๋๋ค.
์์ three๋ Double ํ์ ๊ณผ ๊ณ์ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์, Double(three)๋ก ํ์ ๋ณํ์ ํด์ฃผ๊ณ ๊ณ์ฐ์ ํด์ค๋๋ค.
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi๋ 3.14159์ด๊ณ , Double ํ์
์ผ๋ก ์ถ๋ก ์ด ๋ฉ๋๋ค.
๋ถ๋ ์์์ ์ ๊ฐ์ด ์ ์๋ก ๋ณํ์ด ๋ ๋ ์์์ ์๋๋ฅผ ๋ฒ๋ฆผํฉ๋๋ค.
์ด๊ฒ์ 4.75๋ 4, ๊ทธ๋ฆฌ๊ณ -3.9๋ -3์ด ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
let integerPi = Int(pi)
// ์ ์๋ก ๋ณํ๋๋ฉด์ 0.14159๋ฅผ ๋ฒ๋ฆผํฉ๋๋ค.
์ซ์ ์์์ ๋ณ์๋ฅผ ๊ฒฐํฉํ๋ ๊ท์น (๊ฐ์ ํ์ ๋ผ๋ง ๊ณ์ฐ ๊ฐ๋ฅ)์ ์ซ์ ๋ฆฌํฐ๋ด ๊ท์น๊ณผ ๋ค๋ฆ ๋๋ค.
(โ๏ธ์๋ ์์๋ฅผ ๋ณด๋ฉด ๋ฌด์จ ๋ง์ธ์ง ์ดํด๋์ค๊ฒ๋๋ค.)
์๋์ ๊ฐ์ ๊ฒฝ์ฐ๋, ์ด๋ฏธ ์ปดํ์ผ๋ฌ๊ฐ 3๊ณผ 3.141592 ๋ฆฌํฐ๋ด์ ํ๊ฐํ๊ณ ํด๋น ์์์ ํ์ ์ ์ถ๋ก ํ ๋ค,
๋ค๋ฅธ ํ์ ์ ์์๋ผ๋ฆฌ ๊ฒฐํฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ท์น์ ์๋ฐฐ๊ฐ ๋๋ ๊ฒ์ ๋๋ค.
let three = 3
let pi = 3.141592
let num = three + pi
//Error: Binary operator '+' cannot be applied to operands of type 'Int' and 'Double'
๊ทธ๋ฌ๋, ์๋ ๊ฒฝ์ฐ๋ 3์ ์ซ์ ๋ฆฌํฐ๋ด์ ๋ช ์์ ์ธ ํ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฆฌํฐ๋ด ๊ฐ 0.14159์ ์ง์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ํ์ ์ ์ปดํ์ผ๋ฌ๊ฐ ์คํ๋๋ ์์ ์์๋ง ์ถ๋ก ๋ฉ๋๋ค.
(โ๏ธ์๋ง.. 3์ ์ถ๋ก ํ๋ ค๊ณ ๋ณด๋ ๋ค์ Double ํ์ ๊ณผ ๊ฒฐํฉ์ด ๋์ด์ผ ํ๋ ์ํฉ์ด๋, ๋ฆฌํฐ๋ด 3์ Double ํ์ ์ผ๋ก ์ถ๋ก ํ๋ค๋ ๋ง ๊ฐ์์.)
let pi = 3 + 0.141592
ํ์ ๋ณ์นญ (Type Aliases)
ํ์ ๋ณ์นญ์ ์กด์ฌํ๋ ํ์ ์ ์ด๋ฆ์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ ์ํ ์ ์๊ณ , typealias ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํฉ๋๋ค.
๊ธฐ์กด ํ์ ์ ๋ ๋ง๋ ๋งฅ๋ฝ์์ ์ฌ์ฉํ๊ธฐ ์ํด ์๋ก์ด ์ด๋ฆ์ผ๋ก ์ฐธ์กฐํ ๋ ์ ์ฉํฉ๋๋ค. ํนํ ์ธ๋ถ ์์ค์์ ํน์ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค.
typealias AudioSample = UInt16
์๋กญ๊ฒ ์ ์ํ ํ์ ์ ์๋ ํ์ ์ด ์ฌ์ฉ๋ ์ ์๋ ์์น์์ ๋ชจ๋ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
AudioSample์ UInt16์ ๋์ ํ์ฌ ์ ์๋ ๊ฒ์ ๋๋ค.
(โ๏ธ๊ฐ๋จํ๊ฒ ์๊ฐํด์ ์ํ์์ ํํ ์ฌ์ฉํ๋ ์นํ์ ์๊ฐํ๋ฉด ๋๊ณ , ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฒ ์ ๋๋ค.!)
var maxAmplitudeFound = AudioSample.min
// maxAmplitudeFound is now 0
์ถ๊ฐ์ ์ธ typealias ์ฌ์ฉ ์์ ์ ๋๋ค.
- Bytes ํ์
๋ณ์นญ ์์:
์ด๋ ๊ฒ ์ ์๋ Byte ํ์ ์ UInt8์ ๋ณ์นญ์ผ๋ก, ์ด์ ๋ฐ์ดํธ ๋จ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ Byte๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.typealias Byte = UInt8
๊ฐ๋ น, ์ธ๋ถ ๋ฐ์ดํฐ ์์ค์์ ๋ฐ์ดํธ(Byte) ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋, ๋ฐ์ดํธ ๋จ์์ ๋ฐ์ดํฐ๋ฅผ ๋ ์๋ฏธ์๋ ์ด๋ฆ์ผ๋ก ์ฐธ์กฐํ๊ธฐ ์ํด ํ์ ๋ณ์นญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ๋ฐฐ์ด ํ์
๋ณ์นญ ์์:
์ด์ StringArray๋ [String]์ ๋ณ์นญ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ฝ๋์์ ๋ ์๋ฏธ ์๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.typealias StringArray = [String]
๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ ๋ ํ์ ๋ณ์นญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์์ด ๋ฐฐ์ด์ ๋ ๋ช ์์ ์ผ๋ก ํํํ๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. - ํํ ํ์
๋ณ์นญ ์์:
์ด์ Coordinate๋ (x: Double, y: Double)์ ๋ณ์นญ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.typealias Coordinate = (x: Double, y: Double)
ํํ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋ฐ์ดํฐ ์ ํ์ ๋ฌถ์ด ํํํ ๋๋ ํ์ ๋ณ์นญ์ ํ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ขํ๋ฅผ ๋ํ๋ด๋ ํํ์ ์ ์ํ ๋ ์ฌ์ฉํฉ๋๋ค.
ํ์ ๋ณ์นญ์ ๊ธฐ์กด ํ์ ์ ์๋ฏธ ์๋ ์ด๋ฆ์ ๋ถ์ฌํ์ฌ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ณ , ํนํ ํน์ ๋งฅ๋ฝ์์ ๋ ์ ํฉํ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค๋๋ค.
๋ถ์ธ (Booleans)
Swift๋ Bool์ด๋ผ ๋ถ๋ฆฌ๋ ๊ธฐ์ข Boolean type์ ๊ฐ์ต๋๋ค. ๋ํ 2๊ฐ์ Bool ๊ฐ์ธ true, false๋ฅผ ์ ๊ณตํ๊ณ , ์ฐธ๊ณผ ๊ฑฐ์ง์ผ๋ก ํํ๋๊ธฐ ๋๋ฌธ์ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ์ผ๋ก ์ฐธ์กฐ๋ฉ๋๋ค.
let orangesAreOrange = true
let turnipsAreDelicious = false
์์์ ์ค๋ช ํ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, Bool ํ์ ๋ ํ์ ์ถ๋ก ์ด ๋๊ธฐ ๋๋ฌธ์ true๋ false ๊ฐ์ ๋ฏธ๋ฆฌ ์ถ๊ฐํด์ค๋ค๋ฉด Bool ํ์ ์ ์ ์ธํ ํ์๊ฐ ์์ต๋๋ค.
๋ถ์ธ ๊ฐ์ if๋ฌธ๊ณผ ๊ฐ์ ์กฐ๊ฑด๋ฌธ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
if turnipsAreDelicious {
print("Mmm, tasty turnips!")
} else {
print("Eww, turnips are horrible.")
}
// Prints "Eww, turnips are horrible."
Swift์ ํ์ ์ธ์ดํํฐ๋ ๋ถ์ธ์ด ์๋ ๊ฐ์ด Bool๋ก ๋์ฒด๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ปดํ์ผ ์ ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค.
let i = 1
if i {
// this example will not compile, and will report an error
}
์๋์ ๊ฐ์ด ํด์ฃผ๋ฉด ๋์ํฉ๋๋ค.
i == 1 ๋น๊ต ๊ฒฐ๊ณผ๋ Bool ํ์ ์ด๋ฏ๋ก, if๋ฌธ์ ์กฐ๊ฑด ์ ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
(โ๏ธ๊ณ์ํด์ ํ์ ์ธ์ดํํฐ๋ฅผ ๊ฐ์กฐํ๋ ๋๋..๐ )
let i = 1
if i == 1 {
// this example will compile successfully
}
ํํ (Tuples)
ํํ์ ์ฌ๋ฌ ๊ฐ์ ๋จ์ผ ๋ณตํฉ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํ ํฉ๋๋ค. ๋ํ ํํ ์์ ๊ฐ์ ์ด๋ ํ ํ์ ๋ ๊ฐ๋ฅํ๋ฉฐ ์๋ก ๊ฐ์ ํ์ ์ผ ํ์๋ ์์ต๋๋ค.
์๋ ์์๋ HTTP ์ํ ์ฝ๋๋ฅผ ๋ํ๋ด๋ ํํ๋ก, Int์ String ํ์ ์ ๊ฐ์ ํจ๊ป ๊ทธ๋ฃนํํ์ฌ ์ ๊ณตํฉ๋๋ค.
ํด๋น ์์์ ํํ ํ์ ์ (Int, Stirng)์ผ๋ก ์ค๋ช ํ ์ ์์ต๋๋ค.
let http404Error = (404, "Not Found")
๋ชจ๋ ํ์ ์ ํํ์ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ํ๋ ๋งํผ ๋ค๋ฅธ ํ์ ์ ํฌํจํ ์ ์์ต๋๋ค.
(โ๏ธ์ ์ฌ๊ธฐ์ permutation(: ์์ด) ๋จ์ด๋ฅผ ์ผ๋์ง ์๋ฌธ์ด์๋๋ฐ, ์ฐพ์๋ณด๋ permutation์ด ์ฌ๋ฌ ๊ฐ์ง ์ ํ์ ์กฐํฉํ์ฌ ๋ง๋ค ์ ์๋ ๋ค์ํ ์กฐํฉ์ ๋ํ๋ธ๋ค๊ณ ํฉ๋๋ค!)
(โ๏ธ๋ค์ ๋งํด, ์ฌ๋ฌ ๊ฐ์ง ์ ํ์ ํ์ ๋ค์ ์กฐํฉํ์ฌ ํํ์ ๋ง๋ค ์ ์๋ค!)
ํํ์ ๊ฐ๋ค์ ๋ณ๋๋ก ์์์ ๋ณ์๋ก ๋ถํดํ์ฌ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
statusCode์ 404๊ฐ, statusMessage์๋ “Not Found”๊ฐ ์ ์ฅ๋ ๊ฒ๋๋ค.
let (statusCode, statusMessage) = http404Error
print("The status code is \\(statusCode)")
// Prints "The status code is 404"
print("The status message is \\(statusMessage)")
// Prints "The status message is Not Found"
๋ง์ฝ ํํ์ ๊ฐ๋ค ์ค ์ผ๋ถ๋ง ํ์ํ๋ค๋ฉด **๋ฐ์ค(_)**์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
ํํ์ ๋ ๋ฒ์งธ ๊ฐ์ด ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ (_)์ ์ฌ์ฉํ์ฌ ๋ถํดํ ๋ ๋ฌด์ํฉ๋๋ค.
(โ๏ธ์ธ๋๋ฐ๋ฅผ ์ฐ๋ ๊ฒ์ wildcard pattern์ด๋ผ๊ณ ๋ถ๋ฅธ๋์!)
// ๋ฐ์ค(_)๋ก ํํ์ ์ผ๋ถ ๋ฌด์
let (justTheStatusCode, _) = http404Error
print("The status code is \\(justTheStatusCode)")
// Prints "The status code is 404"
๋๋, 0์ผ๋ก ์์ํ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํํ์ ๊ฐ๋ณ ์์ ๊ฐ์ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
print("The status code is \\(http404Error.0)")
// Prints "The status code is 404"
print("The status message is \\(http404Error.1)")
// Prints "The status message is Not Found"
ํํ์ ์ ์ํ ๋, ๊ฐ๊ฐ์ ์์์ ์ด๋ฆ์ ์ ํ ์ ์์ต๋๋ค.
let http200Status = (statusCode: 200, description: "OK")
๋ง์ฝ ํํ ์์์ ์ด๋ฆ์ด ์๋ค๋ฉด, ์์์ ์ด๋ฆ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
print("The status code is \\(http200Status.statusCode)")
// Prints "The status code is 200"
print("The status message is \\(http200Status.description)")
// Prints "The status message is OK"
ํํ์ ํจ์์ ๋ฐํ ๊ฐ์ผ๋ก ํนํ ์ ์ฉํฉ๋๋ค. ์น ํ์ด์ง๋ฅผ ๊ฒ์ํ๋ ํจ์๋ ์ฑ๊ณต์ด๋ ์คํจ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด (Int, String) ํํ ํ์ ์ ๋ฐํํฉ๋๋ค. ์ด ํจ์๋ ๊ฐ๊ฐ ๋ค๋ฅธ ํ์ ์ 2๊ฐ์ง ๊ณ ์ ๊ฐ์ ๊ฐ๋ ํํ์ ๋ฆฌํดํ์ฌ ๋จ์ผ ๊ฐ๋ง ๋ฆฌํดํ๋ ํจ์๋ณด๋ค ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํํ์ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์๋ ์ ํฉํ์ง ์๊ณ , ๊ด๋ จ๋ ๊ฐ์ ๊ฐ๋จํ ๊ทธ๋ฃน์ ๋ง๋ค ๋ ์ ์ฉํฉ๋๋ค.
๋ง์ฝ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ณต์กํ ๊ฒฝ์ฐ์๋ ํํ์ด ์๋ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ต์ ๋ (Optionals)
๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ ์ต์ ๋์ ์ฌ์ฉํฉ๋๋ค.
์ต์ ๋์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ํ๋๋ ์ง์ ๋ ํ์ ์ ๊ฐ์ด ์์ด ์ต์ ๋์ ์ธ๋ํํด์ ๊ฐ์ ์ ๊ทผํ๋ ๊ฒ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ ๊ฐ์ด ์๋ ๊ฒ ์ ๋๋ค.
์๋ ์์๋ String์ Int๋ก ์ด๊ธฐํ๋ ์ฝ๋์ ๋๋ค. ๊ทธ๋ฌ๋ String ํ์ ์ ๊ฐ์ด Int๋ก ์ด๊ธฐํ ๋ ๋ ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ Int ํ์ ์ด ์๋ ์ต์ ๋ Intํ์ ์ ๋ฐํํ๋ ๊ฒ๋๋ค.
(โ๏ธ๋ง์ฝ Stirng ํ์ ์ ๊ฐ์ด “Hello”๋ผ๋ฉด ์ด๊ธฐํ๊ฐ ์คํจ๋ ๊ฒ์ ๋๋ค.)
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// The type of convertedNumber is "optional Int"
nil
์ต์ ๋ ๋ณ์์ ๊ฐ์ด ์์์ ๋ํ๋ด๊ธฐ ์ํด nil๋ก ์ง์ ํ ์ ์์ต๋๋ค.
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
๊ธฐ๋ณธ๊ฐ ์์ด ์ต์ ๋ ํ์ ์ ๋ณ์๊ฐ ์ง์ ์ด ๋๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก nil ๊ฐ์ด ์ ์ธ๋ฉ๋๋ค.
var surveyAnswer: String?
// surveyAnswer is automatically set to nil
if ๋ฌธ์ผ๋ก ๊ฐ์ ์ฐ์ฐ์ (==) ๋๋ ๊ฐ์ง ์์ ์ฐ์ฐ์ (! =)์ ์ฌ์ฉํ์ฌ ์ต์ ๋์ด ๊ฐ์ ๊ฐ๋์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
nil๊ณผ ๊ฐ์ง ์๋ค๋ฉด ์ต์ ๋์ ๊ฐ์ ๊ฐ๊ณ ์๋ ๊ฒ๋๋ค.
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
if convertedNumber != nil {
print("convertedNumber contains some integer value.")
}
// Prints "convertedNumber contains some integer value."
์ต์ ๋ ํ์ ์ด ์๋ ๋ณ์๋ ์์์๋ nil์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ฝ ์ต์ ๋์ด ์๋ ๊ฐ์ nil์ ํ ๋นํ๋ค๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ต์ ๋๊ณผ ์ต์ ๋์ด ์๋ ๊ฐ์ ๋ถ๋ฆฌ๋ ๋๋ฝ๋ ์ ๋ณด๋ฅผ ๋๋ฝ๋ ์ ๋ณด๋ฅผ ๋ถ๋ช ํ ํ์ํ ์ ์๊ณ , ์ด๋ฐ ์ค์๋ ์ปดํ์ผ ์๊ฐ์ ์ค๋ฅ๋ฅผ ๋ฐ์ํ๋ฏ๋ก ์ต์ ๋์ ์ต์ ๋์ด ์๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ต์ ๋ ๊ฐ์ ์ ๊ทผํ ๋, nil๊ณผ nil์ด ์๋ ๊ฒ์ ๋ํด ๋ชจ๋ ๋ค๋ค์ผ ํฉ๋๋ค. ๊ฐ์ด ์์ ๋ ํ ์ ์๋ ๋ฐฉ์์ด ๋ช ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- nil์ผ ๋ ํด๋น ๊ฐ์ ๋ํ ๋์์ ์คํตํฉ๋๋ค.
- nil์ ๋ฆฌํดํ๊ฑฐ๋, ์ต์ ๋ ์ฒด์ธ์์ ์ค๋ช ํ ? ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ nil์ ์ ํํฉ๋๋ค.
- ?? ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ฒด ๊ฐ(fallback value)์ ์ ๊ณตํฉ๋๋ค.
- ! ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ ์คํ์ ๋ฉ์ถฅ๋๋ค.
Objective-C์์ nil์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์๋ ํฌ์ธํฐ์ด์ง๋ง, Swift์์๋ ํฌ์ธํฐ๊ฐ ์๋๋๋ค.
ํน์ ํ์ ์ ๊ฐ์ด ์์์ ๋ํ๋ด๊ณ , ๋ชจ๋ ์ต์ ๋ ํ์ ์ ๊ฐ์ฒด ํ์ ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ nil๋ก ์ค์ ํ ์ ์์ต๋๋ค.
์ต์ ๋ ๋ฐ์ธ๋ฉ (Optional Binding)
์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์ต์ ๋์ด ๊ฐ์ ํฌํจํ๊ณ ์๋์ง๋ฅผ ํ์ธํ๊ณ , ๊ฐ์ด ์๋ค๋ฉด ์ผ์์ ์ผ๋ก ์์๋ ๋ณ์๋ก ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๋ฐฉ์์ ๋๋ค.
if, guard, while๋ฌธ์ ํตํด ๋ด๋ถ์ ๊ฐ์ด ์๋์ง ์ฒดํฌํ๊ณ ๋จ์ผ ๋์์ ์ผ๋ถ๋ก ์์๋ ๋ณ์๋ก ์ถ์ถํ ์ ์์ต๋๋ค.
์๋ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ต์ ๋ ํ์ ์ someOptional์ด ๊ฐ์ ๊ฐ๊ณ ์๋ค๋ฉด contantName์ผ๋ก ๋ฐ์ธ๋ฉ์ด ๋์ด
if ๊ตฌ๋ฌธ ๋ด์์ ๊ทธ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
if let <#constantName#> = <#someOptional#> {
<#statements#>
}
๊ฐ์ ์ ๊ทผํ ํ์ ๊ธฐ์กด ์ต์ ๋ ์์ ๋๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ ํ์๊ฐ ์๋ค๋ฉด ๊ฐ์ ์ด๋ฆ์ผ๋ก ์๋ก์ด ์์ ๋๋ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
if let myNumber = myNumber {
// Here, myNumber is a non-optional integer
print("My number is \\(myNumber)")
}
์์ ์ฝ๋๋ฅผ ๋ ์งง๊ฒ ์ฌ์ฉํ์ฌ ์ต์ ๋ ๊ฐ์ ์ธ๋ํํ ์ ์์ต๋๋ค.
if let myNumber {
print("My number is \\(myNumber)")
}
// Prints "My number is 123"
์์ ์์ ์ฝ๋์์ ๊ณ์ let์ ์ฌ์ฉํ์ฌ ๋ฐ์ธ๋ฉํ๊ณ ์๋๋ฐ, var๋ฅผ ์ฐ๋ฉด ๋ณ์๋ก ๋ฐ์ธ๋ฉํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ง์ฝ ํด๋น ๋ณ์๋ฅผ if๋ฌธ ๋ด์์ ๊ฐ์ ๋ฐ๊พผ๋ค๋ฉด ์ด๋ ์ง์ญ ๋ณ์์๋ง ์ ์ฉ์ด๋๊ณ , ๊ธฐ์กด ์ธํจ๋ง๋ ์ต์ ๋ ์์ ๋๋ ๋ณ์์ ์ ์ฉ๋์ง ์์ต๋๋ค.
let myName: String? = "Leo"
if var myName {
myName = "ํ๊ธธ๋"
print("์ง์ญ ๋ณ์: \\(myName)")
}
// ๊ฐ์ ์ธ๋ํ
print(myName!)
if ๊ตฌ๋ฌธ์ ์ผํ๋ก ๊ตฌ๋ถํ์ฌ ์ต์ ๋ ๋ฐ์ธ๋ฉ๊ณผ ์กฐ๊ฑด ํ๋จ์ ์ฌ๋ฌ ๊ฐ ํฌํจํ ์ ์์ต๋๋ค.
์ต์ ๋ ๋ฐ์ธ๋ฉ ๊ฐ ์ค nil์ด ์๊ฑฐ๋, ์กฐ๊ฑด ๋ฌธ์ false๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด ์ ์ฒด if๋ฌธ์ ์กฐ๊ฑด์ fasle๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\\(firstNumber) < \\(secondNumber) < 100")
}
// Prints "4 < 42 < 100"
if let firstNumber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber && secondNumber < 100 {
print("\\(firstNumber) < \\(secondNumber) < 100")
}
}
}
// Prints "4 < 42 < 100"
if๋ฌธ์ผ๋ก ์ต์ ๋ ๋ฐ์ธ๋ฉํ ์์๋ ๋ณ์๋ ํด๋น ๊ตฌ๋ฌธ์ ๋ณธ๋ฌธ์์๋ง ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ guard ๊ตฌ๋ฌธ์ผ๋ก ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ํ๋ค๋ฉด guard ๊ตฌ๋ฌธ ๋ฐ์์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
let myName: String? = "Leo"
let myAge: Int? = nil
func useGuardOptionalBinding() {
guard let myName else {
print("nil์
๋๋ค.")
return
}
// ๋ฐ์ธ๋ฉ๋ myName์ guard๋ฌธ ๋ฐ์์ ์ฌ์ฉํฉ๋๋ค.
print(myName)
guard let myAge else {
// ๊ฐ์ด ์์ผ๋ฏ๋ก guard๋ฌธ์ else ๊ตฌ๋ฌธ์ด ์คํ๋ฉ๋๋ค.
print("nil์
๋๋ค.")
return
}
// ์์ guard๋ฌธ์์ ํด๋น ํจ์๊ฐ ์ข
๋ฃ๋์ด ์คํ๋์ง ์์ต๋๋ค.
print(myAge)
}
useGuardOptionalBinding()
๋์ฒด๊ฐ ์ ๊ณต (provide a Fallback Value)
์ต์ ๋ ํ์ ์ด ๊ฐ์ด ์๋ ์ํฉ์ ๋ค๋ฃจ๊ธฐ ์ํด nil-๊ฒฐํฉ ์ฐ์ฐ์ (??)๋ฅผ ์ฌ์ฉํ์ฌ ๋ํดํธ ๊ฐ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ต์ ๋์์ ?? ์ ์ผํธ์ด nil ์ด ์๋๋ฉด, ๊ฐ์ ์ธ๋ํ๋๊ณ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ?? ์ ์ค๋ฅธํธ์ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
let name: String? = nil
let greeting = "Hello, " + (name ?? "friend") + "!"
print(greeting)
// Prints "Hello, friend!"
๊ฐ์ ์ธ๋ํ (Force Unwrapping)
nil์ด ํ๋ก๊ทธ๋๋จธ์ ์๋ฌ๋ ์์น์์ ์ํ์ ๊ฐ์ด ํ๋ณตํ ์ ์๋ ์คํจ๋ฅผ ๋ํ๋ผ ๋, ์ต์ ๋์ ๋ค์ ๋๋ํ (!)๋ฅผ ์ถ๊ฐํ์ฌ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ์ ์ธ๋ํ์ด๋ผ๊ณ ํฉ๋๋ค. ๋ํ nil์ ๊ฐ์ ์ธ๋ํํ๋ค๋ฉด ๋ฐํ์ ์๋ฌ๋ฅผ ์ ๋ฐํฉ๋๋ค.
(โ๏ธ์ฌ์ค ์ฒ์์๋ ์ด ๋ง์ด ์ดํด๋์ง ์์์ต๋๋ค๋ง, ๊ณ์ ๊ณ ๋ฏผํด๋ณธ ๊ฒฐ๊ณผ
์ด ๋ง์ ํ๋ก๊ทธ๋๋จธ์ ์ค์๋ ํ๋ณตํ ์ ์๋ ์คํจ๋ฅผ ๋ํ๋ธ๋ค๋ ๊ฒ์ธ๋ฐ, ์ด๋ ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ๋ ์ด์ ์ฑ์ ์ง์ํ๋ ๊ฒ์ด ๋ถ์ ์ ํ๊ณ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ์ข ๋ฃ์์ผ์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ์ด ์ํฉ์์๋ ๊ฐ์ ์ธ๋ํ์ ์ฌ์ฉํ์ฌ nil์ ํ์ธํ๊ณ , nil์ ํตํด ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ํ์ธ๋๋ฉด ์ฑ์ ์ข ๋ฃ์์ผ๋ฒ๋ฆฌ๋ ๊ฒ์ ๋ํ๋ ๋๋ค.)
(โ๏ธํ์ง๋ง, ๊ฐ์ ์ข ๋ฃ๋ ์ฌ์ฉ์์๊ฒ ์ข์ ๊ฒฝํ์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์๋ ์ด๋ฌํ ์ํฉ์ ๋๋นํ์ฌ ์ฑ์ ๊ฐ์ ๋ก ์ข ๋ฃ์ํค๋ ๋์ ๋ ๋ค๋ฅธ ํด๊ฒฐ์ฑ ์ ๋ง๋ จํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค!!)
(โ๏ธ๋ฐ์ ํ ๋งํ ๋ฌธ์ ๋ฅผ ๋ฏธ๋ฆฌ ์๊ฐํ๊ณ , ์์ธ์ฒ๋ฆฌ๋ฅผ ํด๋ฌ์ผ๊ฒ ์ฃ ??)
๋๋ํ(!)๋ fatalError(_:file:line:)์ ์งง์ ์์ฑ๋ฒ์ ๋๋ค.
fatalError(_:file:line:) | Apple Developer Documentation
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
let number = convertedNumber!
// converedNumber๊ฐ Nil์ผ ๊ฒฝ์ฐ else ๊ตฌ๋ฌธ ์คํ
guard let number = convertedNumber else {
fatalError("The number was invalid")
}
์์์ ์ผ๋ก ์ธ๋ํ๋ ์ต์ ๋ (Implicitly Unwrapped Optionals)
ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ์ ์ต์ ๋์ด ๊ฐ์ ์ฒ์ ์ค์ ํ ํ์ ํญ์ ๊ฐ์ ๊ฐ๋ ๊ฒ์ด ๋ถ๋ช ํ ๋๊ฐ ์์ต๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ํญ์ ๊ฐ์ด ์๋ค๊ณ ๊ฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๊ทผํ ๋๋ง๋ค ์ต์ ๋์ ๊ฐ์ ํ์ธํ๊ณ ์ธ๋ํํ ํ์๊ฐ ์์ต๋๋ค.
์ด๋ฌํ ์ต์ ๋์ ์์์ ์ผ๋ก ์ธ๋ํ ๋ ์ต์ (implicitly unwrapped optionals)๋ก ์ ์ํฉ๋๋ค.
์ต์ ๋ ํ์ ์ ๋ง๋ค ๋ ๋ฌผ์ํ(?) ๋์ ๋๋ํ(!)๋ฅผ ์จ์ ์์์ ์ผ๋ก ์ธ๋ํ ๋ ์ต์ ๋์ ์์ฑํฉ๋๋ค.
ํ์ง๋ง, ์์์ ์ผ๋ก ์ธ๋ํ๋ ์ต์ ๋์ด nil์ผ ๊ฒฝ์ฐ์ ์ ๊ทผํ๋ค๋ฉด ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ์ฉํ ๋ ์ต์ ๋ ์ด๋ฆ์ ๋ค์ ๋๋ํ๋ฅผ ์์น์ํค๋ ๊ฒ๋ณด๋ค ์ ์ธํ ๋ ์ต์ ๋ ํ์ ๋ค์ ๋๋ํ๋ฅผ ์์น์ํค๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
(โ๏ธ๊ฐ์ ์ธ๋ํ์ ํ๋ ๊ฒ๋ณด๋ค, ์ฒ์๋ถํฐ ์์์ ์ผ๋ก ์ธ๋ํ๋ ์ต์ ๋ ํ์ ์ผ๋ก ์ ์ธํ๋ ๊ฒ ๋ ์ข๋ค๋ ๋ง์ ๋๋ค.)
์์์ ์ผ๋ก ์ธ๋ํ๋ ์ต์ ๋์ ์ฒ์ ์ ์๋ ์งํ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒ์ผ๋ก ํ์ธ๋๊ณ ๊ทธ ์ดํ ๋ชจ๋ ์์ ์ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด Swift์์๋ ํด๋์ค ์ด๊ธฐํ ์ค์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
์์์ ์ผ๋ก ์ธ๋ํ๋ ์ต์ ๋ ์ฌ์ฉ์ด ์ต์ ๋์ ๊ฐ์ ๋ก ์ธ๋ํ์ ํ๋ฝํ๋ ๊ฒ์ผ๋ก ์๊ฐํ ์ ์์ง๋ง ์๋๋๋ค.
Swift๋ ํด๋น ๊ฐ์ ์ฌ์ฉํ ๋ ๊ธฐ์กด์ ์ต์ ๋ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๊ณ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ Swift๋ ๊ฐ์ ์ธ๋ํ์ ํฉ๋๋ค.
๋ฐ๋ผ์ ์๋์ implicitString์ String ํ์ , optionalString์ String? ํ์ ์ผ๋ก ์๋ก ๋ค๋ฆ ๋๋ค.
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // Requires explicit unwrapping
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // Unwrapped automatically
let optionalString = assumedString
// The type of optionalString is "String?" and assumedString isn't force-unwrapped.
(โ๏ธ์๊ฑด ์ฒ์ ์์์ด์.. ๋ฌด์จ ๋ง์ด๋๋ฉด, ์์์ ์ผ๋ก ์ธ๋ํ๋ ์ต์ ๋ ํ์ ์ ๊ฐ์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ํด๋น ๊ฐ์ ์ต์ ๋ ํ์ ์ ๊ฐ์ผ๋ก ์ฌ์ฉํด๋ ๋๋ค๋ฉด Swift๋ ์ต์ ๋ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง ์ต์ ๋ ๊ฐ์ ์ฌ์ฉํ๋ฉด ์๋๋ ๊ฒฝ์ฐ์๋ Swift๊ฐ ์ธ๋ํ์ ํด์ ๊ฐ์ ์ฌ์ฉํ๋ค๋ ๋ง์ ๋๋ค.)
(โ๏ธ๋ ๊ฐ๋จํ๊ฒ ๋งํด์ ์์์ ์ผ๋ก ์ธ๋ํ๋ ์ต์ ๋ ํ์ ์ ๊ฐ์ ์ฌ์ฉํ ๋, ๊ฐ์ด ์ต์ ๋ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋๋ ๊ฒฝ์ฐ ๊ทธ๋ ๊ฒ ํ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ๊ฐ์ ์ธ๋ํ์ ํตํด ํด๋น ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ ํ์๋ ํด๋น ๊ฐ์ ์ฌ์ฉํ ๋ ์ธ๋ํ๋ ๊ฐ์ผ๋ก ์ทจ๊ธ๋ฉ๋๋ค!)
(โ๏ธ์๋ print๋ฌธ์์ assumedString์ ๊ฐ์ ์ธ๋ํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ต์ ๋ ๊ฐ ๊ทธ๋๋ก ํ๋ฆฐํธ ๋๋ ๊ฒ์ ๋๋ค.)
let assumedString: String! = "An implicitly unwrapped optional string."
print(assumedString)
// ์ถ๋ ฅ: Optional("An implicitly unwrapped optional string.")
์๋ฌ ์ฒ๋ฆฌ (Error Handling)
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ์๋ฌ๊ฐ ๋ฐ์ํ ๋๋ฅผ ๋์ํ๊ธฐ ์ํด ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ ์กด์ฌ ์ ๋ฌด๋ก ํจ์์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ์๋ ค์ฃผ๋ ์ต์ ๋๊ณผ๋ ๋ฌ๋ฆฌ, ์๋ฌ ์ฒ๋ฆฌ๋ ์คํจ์ ์์ธ์ ์ ์ ์๊ณ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์๋ฌ๋ฅผ ์ ํํ ์๋ ์์ต๋๋ค.
ํจ์๊ฐ ์๋ฌ ์กฐ๊ฑด์ ๋ง๋๋ฉด ์๋ฌ(error)๋ฅผ ๋์ง๊ณ , ํจ์์ ํธ์ถ์๋ ์๋ฌ๋ฅผ ํฌ์ฐฉ(catch)ํ๊ณ ์ ์ ํ ๋์ํฉ๋๋ค.
ํจ์์ ์ ์ธ์ throws ํค์๋๋ฅผ ํฌํจ์์ผ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์์ ๋ํ๋ด๊ณ , ํด๋น ํจ์๋ฅผ ํธ์ถํ ๋๋ ํํ์ ์์ try ํค์๋๋ฅผ ๋ถ์ ๋๋ค(= ๋ํํฉ๋๋ค).
๋ํ, do ๊ตฌ๋ฌธ์ ์๋ฌ๋ฅผ ํ๋ ์ด์์ catch ์ ๋ก ์ ํํ ์ ์๋ ์๋ก์ด ๋ฒ์๋ฅผ ๋ง๋ค๊ณ , Swift๋ ๋์ ธ์ง ์๋ฌ๊ฐ catch ์ ์ ์ํด ์ฒ๋ฆฌ๋ ๋๊น์ง ์๋ฌ๋ฅผ ์๋์ผ๋ก ์ ํํฉ๋๋ค.
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients)
}
์ญ์ค๊ณผ ์ ์ ์กฐ๊ฑด (Assertions and Preconditions)
Assertion๊ณผ Precondition์ ๋ฐํ์์ ๋ฐ์ํ๋ ์ฌํญ์ ํ์ธํ๋ ๋๊ตฌ์ ๋๋ค. ์ถ๊ฐ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ํ์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๋ง์ฝ Assertion ๋๋ Precondition์์ false๋ก ํ๋จ๋๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ๋ฉ๋๋ค. Assertion์ ๊ฐ๋ฐ ๊ณผ์ ์์ ์ค์๋ ์๋ชป๋ ๊ฐ์ ์ ์ฐพ๋ ๋ฐ ๋์์ด ๋๋ฉฐ, Precondition์ ํ๋ก๋์ ์์ ์ด์๋ฅผ ๊ฐ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์๋ฌ ์ฒ๋ฆฌ์๋ ๋ฌ๋ฆฌ Assertion๊ณผ Precondition์ ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ๋์ง ์๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ฆ์ ์ข ๋ฃ์ํต๋๋ค. ์ด๋ ๊ฐ์ ์ ํ์ธํ์ง ์๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ์์๋๊ธฐ ์ ์ ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์งํ์ฌ ์๋ฐฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
Assertion๊ณผ Precondition์ ์ฃผ์ ์ฐจ์ด๋ ์ธ์ ์ฒดํฌ๋๋์ง์ ์์ต๋๋ค. Assertion์ ์ฃผ๋ก ๋๋ฒ๊ทธ ๋น๋์์๋ง ํ์ธ๋์ง๋ง, Precondition์ ๋๋ฒ๊ทธ์ ํ๋ก๋์ ๋น๋์์ ๋ชจ๋ ๊ฒ์ฌ๋ฉ๋๋ค.
Assertion์ ํ๋ก๋์ ๋น๋์์ ํ์ธ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ๊ฐ๋ฐ ๋จ๊ณ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ญ์ค์ ํตํ ๋๋ฒ๊น (Debugging with Assertions)
Swift ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ assert(_:_:file:line:) ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ด ํจ์์ true ๋๋ false๋ก ํ๋จ๋ ํํ์๊ณผ false์ผ ๊ฒฝ์ฐ ์ถ๋ ฅํ ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
let age = -3
assert(age >= 0, "A person's age can't be less than zero.")
// This assertion fails because -3 isn't >= 0.
assert(::file:line:) | Apple Developer Documentation
๋ํ, ๋ฉ์์ง๋ฅผ ์๋ตํ์ฌ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
assert(age >= 0)
์ฝ๋๊ฐ ์ด๋ฏธ assertion ์กฐ๊ฑด์ ์ฒดํฌํ๋ค๋ฉด assertionFailure(_:file:line:) ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
if age > 10 {
print("You can ride the roller-coaster or the ferris wheel.")
} else if age >= 0 {
print("You can ride the ferris wheel.")
} else {
assertionFailure("A person's age can't be less than zero.")
}
assertionFailure(_:file:line:) | Apple Developer Documentation
๊ฐ์ ์ ์ ์กฐ๊ฑด (Enforcing Preconditions)
precondition์ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ํด์ ๋ฐ๋์ ์ฐธ์ธ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉํ๋ ๊ฐ๋ค์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ์ ํจ ๊ฐ์ด ์ ๋ฌ๋๋์ง๋ฅผ ์ฒดํฌํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
precondition(::file:line:) ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์คํจ๋ฅผ ์๋ฆด ์ ์๊ณ , ๋ง์ฝ ์กฐ๊ฑด์ด false๋ผ๋ฉด ์ค์ ํด๋ ์ค๋ฅ ๊ตฌ๋ฌธ์ ์ถ๋ ฅํฉ๋๋ค.
// In the implementation of a subscript...
precondition(index > 0, "Index must be greater than zero.")
(-Ounchecked) ๋ชจ๋๋ฅผ ์ฒดํฌํ์ง ์๊ณ ์ปดํ์ผ์ ํ๋ค๋ฉด, precondition์ ์ฒดํฌ๋์ง ์์ต๋๋ค.
์ปดํ์ผ๋ฌ๋ ํญ์ precondition์ ํญ์ true๋ผ๊ณ ๊ฐ์ ํ๊ณ ์ฝ๋๋ฅผ ์ต์ ํํฉ๋๋ค.
๊ทธ๋ฌ๋ fatalError(_:file:line:) ํจ์๋ ์ต์ ํ ์ค์ ๊ณผ ๋ฌด๊ดํ๊ฒ ํญ์ ์คํ์ ์ค์ง์ํต๋๋ค.
ํ๋กํ ํ์ ๊ณผ ์ด๊ธฐ ๊ฐ๋ฐ๋จ๊ณ์์ ์์ง ๊ตฌํ๋์ง ์์ ๊ธฐ๋ฅ์์ fatalError(_:file:line:) ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ fatalError("Unimplemented") ์ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
assertions๊ณผ preconditions์ ๋ฌ๋ฆฌ, fatal error๋ ์ ๋ ์ต์ ํ ๋์ง ์๊ธฐ ๋๋ฌธ์ ํด๋น ์ฝ๋๋ฅผ ๋ง๋๋ฉด ํญ์ ํ๋ก๊ทธ๋จ์ด ์ค์ง๋ฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
์ด๊ฑฐ ์ธ์ ๋ค ๋ณด๊ณ , ์ธ์ ๋ค ์ ๋ฆฌํ์ฃ ..?
์๊ฐ๋ณด๋ค ์์ฒญ ๊ธธ์ด์.. ๊ทธ๋๋ ์๋กญ๊ฒ ์๊ฒ๋ ๋ด์ฉ๋ ์๊ณ ๋จธ๋ฆฌ์ ์ ๋ฆฌ๋ ์ ๋๋ ๋๋์ด๋ผ..
๊พธ์คํ๊ฒ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.๐
์๋ชป๋ ๋ด์ฉ์ด๋ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๐ค
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
Swift ๊ณต์ ๋ฌธ์ - The Basics
๊ณต์ ๋ฌธ์ (ํ๊ธ ๋ฒ์ ) ๊ธฐ๋ณธ (The Basics)
'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Swift์ ํ์ ์บ์คํ (Type Casting) (1) | 2024.06.12 |
---|---|
[Swift] ' % ' ์ฐ์ฐ์๋ ๋ชจ๋๋ก๊ฐ ์๋๋ผ ๋๋จธ์ง์ ๋๋ค. (Remainder Operator) (2) | 2024.02.04 |
- ๋ฒ์ฉ๊ณ ์ ์๋ณ
- ๊ท๋๋ผ๋ฏธ ์์ด
- ๊ดํธ์ ๊ฐ
- Anyobject
- pageViewController
- ์คํ
- 10808
- Swift
- 4949
- ๊ท ํ์กํ ์ธ์
- 2024๋ ๋ชฉํ
- root view controller
- ๊ท๋๋ผ๋ฏธ ์์ด
- ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ํ
- Container View Controller
- BOJ
- tipkit
- remainder
- ์์ด ๊ณต๋ถ
- ์ ๋ง๋๊ธฐ
- ์์ด ๋ด์ค
- 5397
- ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ์๋ฃ ๊ตฌ์กฐ
- gitkraken
- 2023๋ ํ๊ณ
- C++
- containerView
- ๊ณต๊ฐ ๋ณต์ก๋
- Total
- Today
- Yesterday