์์ํ๋ฉฐ
Swift์ ๋ํด์ ์ฒ์ ๊ณต๋ถ๋ฅผ ์์ํด๋ณด๋ ค๊ณ ํ๋ค. ๋ฌด์๋ณด๋ค ์์์ ์ ์๋ถํฐ! Swift ๊ณต์๋ฌธ์๋ฅผ ํตํด ์ฐจ๊ทผ์ฐจ๊ทผ swift์ธ์ด์ ๋ํด์ ๋ฐฐ์๋ณด๋ ค๊ณ ํ๋ค.
Swift ๊ณต์ Documents - The Basics
The Basics
์ค์ํํธ๋ iOS, macOS, watchOS, tvOS์ฑ ๊ฐ๋ฐ์ ์ํ ์๋ก์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ค. ์ค์ํํธ์ ๊ธฐ์ด์ ์ธ ์๋ฃํ์ ์๋์ ๊ฐ๋ค.
- ์ ์๋ฅผ ์ํ Int
- ๋ถ๋์์์ ๊ฐ์ ์ํ Double & Float
- ๋ถ์ธ ๊ฐ์ ์ํ Bool
- ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ํ String
- Array
- Set
- Dictionary
์ค์ํํธ๋ C์ธ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ฅํ๊ณ , ์ฐธ์กฐํ๊ธฐ ์ํด ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฆ์ผ๋ก ๋ณ์๋ฅผ ๊ตฌ๋ถํ๋ค. ์ค์ํํธ์์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ Constant(์์)๋ฅผ ์ ๊ณตํ๊ณ , ์ด ์์๋ก ์ธํด์ C์ธ์ด๋ณด๋ค ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ํํ ์ ์์ ๊ฒ์ด๋ค. ๋ object-C์์๋ ๋ณผ ์ ์์๋ Tuple(ํํ) ํ์์ ์ ๊ณตํ๋ฏ๋ก์จ, ์ฌ๋ฌ ๊ฐ์ ํ๋์ ๊ฐ์ผ๋ก ๋ฐํํ ์ ์๋ค.
์ค์ํํธ์์๋ Optional Type(์ต์ ๋ ํ์ )์ ์ ๊ณตํ๋ค. ์ด๋ ๊ฐ์ด ์์ ๋ ์ ์ดํ ์ ์๋๋ก ํ๋ค. ๋ง์ฝ ๊ฐ์ด ์๋ค๋ฉด ๊ฐ์, ๊ฐ์ด ์๋ค๋ฉด nil ์ ์ฌ์ฉํ๋ค.
์ค์ํํธ๋ type-safe ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ์๋ชป๋ ์๋ฃํ์ ์ฌ์ฉํ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ค์ ์ธ์งํ๊ฒ ํ๋ค. ์๋ฅผ๋ค์ด ์ผ๋ฐ string ๋ณ์์ optional string์ ์ ๋ ฅํ๊ฒ ๋๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค.
Constants and Variables (์์์ ๋ณ์)
Constants(์์)๋ ํ ๋ฒ ์ค์ ํ๋ฉด ๋ณ๊ฒฝํ ์ ์๋ค. Variable(๋ณ์)๋ ๋ณํ ์ ์๋ ๊ฐ์ด๋ค.
์์๋ let์ผ๋ก ์ ์ธ๋๋ฉฐ, ๋ณ์๋ var๋ก ์ ์ธํ ์ ์๋ค.
โถDeclaring Contants ans Variables (์์์ ๋ณ์ ์ ์ธ)
let maximunNumberOfLoginAttempts = 10
var currentLoginAttemp = 0
์์์ ๋ณ์๋ ์ฌ์ฉํ๊ธฐ ์ ์ ์ ์ธ๋์ด์ผ ํ๋ค. ์์๋ก, ์ฌ์ฉ์๊ฐ ์๋ํ ๋ก๊ทธ์ธ ํ์๋ฅผ ์ถ์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ก๊ทธ์ธ ์๋ ์ต๋๊ฐ์ ๊ณ ์ ์ผ๋ก ๊ฐ์ง๊ณ ์์ด์ผํ๋ฏ๋ก ์์๋ก์ maximunNubmerOfLoginAttempts ๋ก 10์ ์ค์ ํด์ฃผ์๊ณ , ์ฌ์ฉ์๊ฐ ์๋ํ ๋ก๊ทธ์ธ ํ์๋ ํ ๋๋ง๋ค +1 ๋์ด์ผํ๋ฏ๋ก ๋ณ์๋ก ์ค์ ํด์ฃผ์๋ค.
์ถ๊ฐ๋ก ๋ณ์๋ ํ์ค๋ก ์ผํ(,)๋ฅผ ์ฌ์ฉํด์ ํ์ค๋ก ์ ์ํ ์ ์๋ค.
var x = 0.0, y = 0.0, z = 0.0
โถ Type Annotations
์์ ๋๋ ๋ณ์๋ฅผ ์ค์ ํ ๋, type annotations์ ์ฌ์ฉํ์ฌ ์์๋ ๋ณ์์ ์๋ฃํ ์ข ๋ฅ๋ฅผ ๋ช ํํ๊ฒ ํ ๋ ์ฌ์ฉ๋๋ค. ํด๋ก (:)+๊ณต๋ฐฑ ์ผ๋ก ์ ์ํ ์ ์๋ค. (์๋)
var welcomeMessage: String
์ ์ฝ๋๋ ๋ณ์๋ก ์ค์ ๋ string์ด๊ธฐ ๋๋ฌธ์, ์ด๋ ํ string ์๋ฃํ์ผ๋ก ์ค๋ฅ์์ด ํด๋น ๋ณ์๋ฅผ ์ด๊ธฐํ ์ํฌ ์ ์๋ค.
welcomMessage = "Hello"
์ถ๊ฐ๋ก type annotation๋ ์ผํ(,)๋ฅผ ์ฌ์ฉํด์ ํ์ค๋ก ํํ ๊ฐ๋ฅํ๋ค.
var red, green, blue: Double
โถ Naming Constants and Variables (์์ ๋ฐ ๋ณ์ ์ด๋ฆ ์ง์ )
๋ณ์์ ์์๋ ์ ๋์ฝ๋์ ์๋ ๋ชจ๋ ๋ฌธ์์ด๋ก ์ด๋ฆ์ ์ค์ ํ ์ ์๋ค. (์ค ๋
ํนํจ!!)
๋จ, ๋ณ์์ ์์์ ์ด๋ฆ์๋ ๋์ด์ฐ๊ธฐ(๊ณต๋ฐฑ)์ด ์กด์ฌํ ์ ์๊ณ , ์ํ๊ธฐํธ, ํ์ดํ, private-use Unicode scalar values, line-and box drawing ๋ฌธ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ํ ์ซ์๋ก ์์ํ ์ ์๋ค. ํ๋ฒ ์์,๋ณ์๋ก ์ ์ธ๋๋ฉด ๊ฐ์ ์ด๋ฆ์ ๋ค๋ฅธ ์์,๋ณ์๋ฅผ ๋ง๋ค ์ ์๊ณ , ์๋ฃํ์ ๋ฐ๊ฟ ์๋ ์๋ค. ์์๋ก ์ค์ ๋ ๊ฒ์ ๋ณ์๋ก ๋ฐ๊พธ๋ ๊ฒ๋ ๋ถ๊ฐ๋ฅํ๋ค.
let π = 3.14159
let ไฝ ๅฅฝ = "ไฝ ๅฅฝไธ็"
let ๐ถ๐ฎ = "dogcow"
โถ printing constants and variables (์์์ ๋ณ์ ์ถ๋ ฅ)
์์์ ๋ณ์๋ print(_:separator:terminator:)ํจ์๋ก ์ถ๋ ฅํ ์ ์๋ค.
var friendlyWelcome = "HI"
print(friendlyWelcome)
printํจ์๋ Xcode์ ์ฝ์์ฐฝ์ ๊ฐ์ ์ถ๋ ฅํ๋ค. separator, terminator์๋ ๋ํดํธ๊ฐ์ด ์์ด์ ํจ์๋ฅผ ์ถ๋ ฅํ ๋ ๊ผญ ๋งค๊ฐ๋ณ์์ ๋ฌด์์ธ๊ฐ๋ฅผ ํด์ฃผ์ง ์์๋ ๋๋ค. terminator๋ ์ข ๊ฒฐ์๋ผ๋ ์๋ฏธ๋ก, ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฐ๊ฟ์ด ์์ด์ printํจ์๋ฅผ ํธ์ถํ๋ฉด ์ค ๋ฐ๊ฟ์ด ๋๋๋ฐ, ์ด๋ฅผ ์ค ๋ฐ๊ฟ์์ด ๋ฃ๊ณ ์ถ๋ค๋ฉด ๋น๋ฌธ์์ด์ ๋ง์นจํ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. print(someValue, terminator:"") swift๋ ๋ฌธ์์ด ๋ณด๊ฐ์ ์ฌ์ฉํ์ฌ ์์๋ ๋ณ์์ด๋ฆ์ ๊ธด ๋ฌธ์์ด์ ์ค๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค.
print("The current value of friendlyWelcome is \(friendlyWelcome)")
// ์ถ๋ ฅ: The current value of friendlyWelcome is HI
โถ Comments (์ฃผ์)
์ฃผ์์ ์ค๋ช ์๋ต ^^
// This is comments.
/* This is also a comment
but is written over multiple lines. */
/*This is the start of the first multiline commet.
/*This is the second, nested multiline comment. */
/*, */๋ก ๋ฌถ์ฌ ์๋ ์ฃผ์์ ์ฌ๋ฌ ์ค์ ํ ๋ฒ์ ์ฃผ์ ์ฒ๋ฆฌ ํ ์ ์๋ค. C์ธ์ด์ ๋ค๋ฅด๊ฒ ์ฃผ์ ์์ ๋ค๋ฅธ ์ฃผ์์ด ์ค์ฒฉ๋ ์ ์๋ค๊ณ ํ๋ค. ์์ ํ์นธ ๋์ด์ด๊ฑฐ ์ฃผ์!
โถ Semicolons (;)
๋ค๋ฅธ ์ธ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ํํธ์์๋ ์ฝ๋ ๋ง์ง๋ง์ ; ๋ฅผ ์ฐ์ง ์์๋ ๋๋ค. (์จ๋ ๋จ.) ํ์ง๋ง ํ ์ค์ ์ฌ๋ฌ๊ฐ์ ์คํ๋ฌธ์ ์ฐ๊ณ ์ถ๋ค๋ฉด ;๋ฅผ ๊ผญ ๋ถ์ฌ์ผ ํ๋ค.
let cat = "๐ฑ"; print(cat) // Prints "๐ฑ"
Integers (์ ์)
integers ๋ 42, -23๊ณผ ๊ฐ์ด ๋ถ์ ์ฑ๋ถ์ด ์๋ ์์ด๋ค. ์์, 0, ์์๊ฐ ์ ์์ ํฌํจํ๋ค. Swift๋ 8, 16, 32, 64๋นํธ ํ์์ ๋ถํธ ์๋ ์ ์์ ๋ถํธ ์๋ ์ ์๋ฅผ ์ ๊ณตํ๋ค. ๋ถํธ๊ฐ ์๋ ์ ์๋ UInt8 ์ ํ์ด๊ณ , ๋ถํธ๊ฐ ์๋ ์ ์๋ Int8์ ํ ์ด๋ค. Swift์ ๋ชจ๋ ํ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ์ ์ํ๋ค์ ๋ชจ๋ ๋๋ฌธ์๋ก ์์ํ๋ค.
โถ ์ ์์ ํ๊ณ๊ฐ
min, max property๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ ์ ํ์ ์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ ๊ทผํ ์ ์๋ค.
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
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ์ํ์ ์ฌ์ฉํ ๋ ํฌ๊ธฐ๋ฅผ ์ ํํ ํ์๋ ์๊ณ Int ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ฌ์ฉ์ ์ปดํจํฐ์ ๋ฐ๋ผ ์์์ Int32, Int64๋ก ์ ์ ๋๋ค. (32๋นํธ ์ปดํจํฐ --> Int32๋ก ์์์ ์ ์) Int32๋ -2,147,483,648 ~ 2,147,483,647 ์ฌ์ด์ ๊ฐ์ ์ ์ฅํ ์ ์์ผ๋ฏ๋ก ์ถฉ๋ถํ ํฌ๋ค.
โถ UInt
Swift๋ ๋ถํธ๊ฐ ์๋ ์ ์ํ UInt๋ ์ ๊ณตํ๋ฉฐ, Int ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์์ ์ ์๋๋ค. (32๋นํธ ์ปดํจํฐ --> UInt32๋ก ์์์ ์ ์)
Floating-Point Numbers (๋ถ๋์์์ )
๋ถ๋์์์ ์ 3.14159, 0.1 ๋ฐ -273.15์ ๊ฐ์ด ๋ถ๋ถ ์ฑ๋ถ์ด ์๋ ์ซ์์ด๋ค. ๋ถ๋์์์ ์ ์ ์ํ๋ณด๋ค ํจ์ฌ ๋์ ๋ฒ์์ ๊ฐ์ ๋ํ๋ผ ์ ์๋ค.
- double : 64๋นํธ ๋ถ๋์์์ ์ซ์
- float : 32๋นํธ ๋ถ๋์์์ ์ซ์
Type Safety and Type Inference
swift๋ type safety ์ธ์ด์ด๋ค. ์ฆ Int ์๋ String ์ ์ ๋ฌํ ์์๋ ๋ฑ ๊ฐ์ ์ ํ์ ๋ช ํํ๊ฒ ํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ํน์ง ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ปดํ์ผ ํ ๋ type๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ์ผ์นํ์ง ์๋ type์๋ error๋ก flag๋ฅผ ์ ์ฅํ๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ ํ๋ก์ธ์ค์์ ์ค๋ฅ๋ฅผ ์ต๋ํ ์ด๊ธฐ์ ๋ฐ๊ฒฌํ๊ณ ์์ ํ ์ ์๋ค.
Type-checking์ ๋ค๋ฅธ ์ ํ์ ๊ฐ์ผ๋ก ์์
ํ ๋, ์ค๋ฅ๋ฅผ ๋ฐฉ์งํด์ค๋ค. ๊ทธ๋ฌ๋ ์ ์ธํ๋ ๋ชจ๋ ๋ณ์๋ ์์์ ์ ํ์ ๋ชจ๋ ์ง์ ํ ํ์๋ ์๋ค. ์ ํ์ ์ ์ธํ์ง ์์ผ๋ฉด swift๋ type-inference์ ํตํด์ ์ ์ ํ ์ ํ์ ๊ฒ์ฌํ๊ณ ๊ณ์ฐํด์ค๋ค.
Type-inference ๋ก ์ธํด์ objective-C ๋ C์ธ์ด์๋ ๋ค๋ฅด๊ฒ ์๋ฃํ์ ์ ์ธ์ด ํ์์ ์ด์ง ์๋ค. ํ์ง๋ง ๋ณ์ ๋ฐ ์์๋ฅผ ์ ์ธํ๋ var๋ let์ ๊ผญ ์จ์ค์ผํ๋ค.
let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int
์ด๋ ๊ฒ Int๋ผ๊ณ ์ง์ ํด์ฃผ์ง ์์๋, swift๋ ์์์ 42๊ฐ Int์์ ์ถ๋ก ํ๋ค.
let pi = 3.14159
// pi is inferred to be of type Double
์ด๊ฒ๋ ์์์ Double๋ก ์ถ๋ก ํ๋ค.
Numeric Literals
์ ์ํ literals๋ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์๋ค.
let decimalInteger = 17
let binaryInteger = 0b10001 // 17 in binary notation
let octalInteger = 0o21 // 17 in octal notation
let hexadecimalInteger = 0x11 // 17 in hexadecimal notation
- ์ ๋์ฌ๊ฐ ์๋ 10์ง์
- ์ ๋์ฌ๊ฐ 0b์ธ 2์ง์
- ์ ๋์ฌ๊ฐ 0o์ธ 8์ง์
- ์ ๋์ฌ๊ฐ 0x์ธ 16์ง์
floating-point ๋ฆฌํฐ๋ด์ ์ ๋์ฌ๊ฐ ์๋ 10์ง์ ์ด๊ฑฐ๋, 16์ง์ (0x ์ ๋์ฌ)์ด๋ค. ํญ์ ์์์ ์์ ์ซ์ (๋๋ 16์ง์)๊ฐ ์์ด์ผ ํ๋ค. ๋ํ e๋ก ํํ๋๋ ์ง์๋ฅผ ๊ฐ์ง ์๋ ์๋ค.
- 1.25e2 means 1.25 x 102, or 125.0.
- 1.25e-2 means 1.25 x 10-2, or 0.0125.
16์ง์์์๋ e๊ฐ ์๋๋ผ p๋ก ์ง์๋ฅผ ํํํ๋ค.
- 0xFp2 means 15 x 22, or 60.0.
- 0xFp-2 means 15 x 2-2, or 3.75.
์๋๋ 12.1875๋ฅผ floating-point๋ก ํํํ ์ฝ๋๋ค.
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
์ ์ ๋ฆฌํฐ๋ด์ ์ฝ๊ธฐ ์ฝ๋๋ก ์์์ ์ถ๊ฐํ ์ ์๋ค. Int ์ float ๋ชจ๋ 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
๊ฐ ์ ์ ํ์ ๋ง๋ค ์ ์ฅํ ์ ์๋ ๊ฐ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ์ฉ์ ์ํด์๋ ๋ค๋ฅธ ์ ์ํ์ ์ผ๋ก ๋ณํ์ ํด์ฃผ์ด์ผ ํ๋ค.
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ง์ง๋ง์ ๋ ๋ณ์๋ฅผ ๋ํด์ค ๋ one๋ณ์๋ฅผ UInt16์ผ๋ก ๋ณํํด์ฃผ๊ณ ๋ํ๋ค. ์ ์ํ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ ํ์ผ๋ก ๋ฐ๊ฟ์คํ ์ฐ์ฐ์ ์ํํด์ผ ํ๋ค.
โถ Integer and Floating-Point Conversion
์ ์์ ๋ถ๋ ์์์ ์ซ์์ ๋ณํ์ ๋ช ์์ ์ผ๋ก ์์ฑํด์ผํ๋ค. ์๋ ์ฝ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ฐ์ ํ์ ์ผ๋ก ๋ณํํ ๋ค ์ฐ์ฐ์ ์ํํด์ผ ํ๋ค.
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double
๋ถ๋์์์ ์ซ์๋ฅผ Intํ์ผ๋ก ๋ณํํ๋ฉด, ์์์ ์๋์ ์๋ ๋ชจ๋ ๋ฒ๋ฆผ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
let integerPi = Int(pi)
// integerPi equals 3, and is inferred to be of type Int
Type Aliases (๋ณ์นญ)
๋ณ์นญ : ๊ธฐ์กด ํ์
์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ์ธํ๋ ๊ฒ
๋ณ์นญ์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๊ฒ ๋๋ฉด, UInt16 ํ์
์ ์๋ฃํ์ AudioSample ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ๋๋ค.
typealias AudioSample = UInt16
Booleans
swift์์๋ ๊ธฐ๋ณธ boolean type์ผ๋ก bool์ ๊ฐ์ง๊ณ ์๋ค. True/False ๊ฐ๋ง์ ๊ฐ์ง ์ ์๋ค.
let orangesAreOrange = true
let turnipsAreDelicious = false
์ด์ฒ๋ผ True, False๋ก ์ค์ ํด์ค๋ค๋ฉด, Bool๋ก ์ ์ธํ ํ์๊ฐ ์๋ค. Boolean ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
if turnipsAreDelicious {
print("Mmm, tasty turnips!")
} else {
print("Eww, turnips are horrible.")
}
// Prints "Eww, turnips are horrible."
Swift๋ type safe ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ boolean๊ฐ์ด ๋ค์ด์์ผํ ์๋ฆฌ์ ๋ค๋ฅธ ๊ฐ์ด ๋ค์ด์ค๊ฒ ๋๋ฉด ๋น์ฐํ ์๋ฌ๋ฅผ ๋ด๋ฑ๋๋ค. ์๋์ ๊ฐ์ ๊ธฐ๋ณธ ์ฐ์ฐ์๋ก๋ bool ์๋ฃํ์ ์ ์ธํ ์ ์๋ค.
let i = 1
if i == 1 {
// this example will compile successfully
}
Tuple (ํํ)
ํํ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ํ๋์ ๋ณตํฉ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํ ํ๋ ๊ฒ์ด๋ค. ํํ ๋ด์ ๊ฐ์ ํ๋์ ์๋ฃํ๋ง ์กด์ฌํด๋ ๋๊ณ , ์ฌ๋ฌ๊ฐ์ ์๋ฃํ์ด ํจ๊ป ์กด์ฌํด๋ ๋ฌด๋ฐฉํ๋ค.
let http404Error = (404, "Not Found")
// http404Error is of type (Int, String), and equals (404, "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"
โถ swift ํํ ์ธ๋๋ฐ (_) ์ฌ์ฉํ์ฌ ์ํ๋๊ฐ ์ถ๋ ฅํ๊ธฐ
๊ฐ๋ฐ์๋ ํํ์ ๊ฐ ์ค์์ ๋ช ๊ฐ์ ๊ฐ๋ง ํ์ํ๋ค๋ฉด, ์ธ๋๋ฐ(_)๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// Prints "The status code is 404"
- http404Error ์์ statusCode ๋ง justTheStatusCode๋ก ๋์ฒด๋๊ณ , ๋ค์ ๊ฐ์ _๋ก ๋ฌด์๋๋ค. ๋ฐ๋ผ์ justTheStattusCode๋ฅผ ์ถ๋ ฅํ๋ฉด ๋ฌด์๋์ง ์์ statusCode๋ง ์ถ๋ ฅ๋๋ค.
let http404Error = (111, 404, "Not Found")
// http404Error is of type (Int, String), and equals (404, "Not Found")
/*let(num1, num2, message) = http404Error
์ด๊ฑด ๊ฐ ํํ์ ์ด๋ฆ์ ์ ํด์ฃผ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์ด๋ฆ์ ์ง์ด์ฃผ๋ ๊ฒ์ ํ์์ ์ด์ง ์๋ค. */
let(_, just, _) = http404Error
print(\(just))
// '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) ํํ ํ์ ์ ์ฌ์ฉํ๋ฉด ์ ์ฉํ ๊ฒ์ด๋ค~!
Optional (์ต์ ๋)
๊ฐ๋ฐ์๋ Optional์ ๋น์ด์๋ ๊ฐ์ ํํํ ๋ ํ์ฉํ ์ ์๋ค. ์ต์ ๋์ ๊ฐ์ด ์๊ฑฐ๋ ์๊ฑฐ๋, ์ด ๋๊ฐ์ง๋ฅผ ํํํ๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ ์ต์ ๋์ ํตํด ๊ฐ์ด ์๋์ง ์๋์ง ํ์ธํด์ผํ๋ค.
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber is inferred to be of type "Int?", or "optional Int"
์ด ์ฝ๋๋ฅผ ๋ณด๋ฉด, string ํํ์ 123์ Int ๋ก ๋ฐ๊ฟ์ฃผ์๋ค. ์ด์ฒ๋ผ String ํ์ ์ Int๋ก ๋ฐ๊ฟ ์์๋ string์ด ์๊ณ , ์๋ String์ด ์๋ค. ์์๋ก "Hello"๋ Int๋ก ๋ฐ๊ฟ ์ ์์ ๊ฒ์ด๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ Int? ๋ optional Int๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, 123์ฒ๋ผ Int๋ก ๋ณํ์ด ๊ฐ๋ฅํ๋ฉด ๊ฐ์ ๋ฃ์ ๊ฒ์ด๊ณ , hello์ฒ๋ผ int๋ก ๋ณํํ ์ ์๋ ๊ฒฝ์ฐ์๋ nil ๊ฐ์ ๋ฃ์์ผ๋ก์จ ์ ์ฒด์ ์ธ ์ฝ๋์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ์๋ฃํ ๋ค์ ? ๋ฅผ ๋ถ์ด๋ฉด ์ต์ ๋๋ก ์ ์ธํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง Int? ๋ฅผ ์ ์ธํ๋ฉด, Intํ๊ณผ nilํ๋ง ์ ์ฅ๋๊ณ , string์ด๋ bool๊ฐ์ ์ ์ฅ๋์ง ์๋๋ค.
var name: String?
print(name)
// name์ ์๋ฃํ๋ง ์ ์ธ๋์๊ณ , ๊ฐ์ด ์ง์ ๋์ง ์์๊ธฐ ๋๋ฌธ์ nil์ ์ถ๋ ฅ
name = "My life story"
print(name)
// My life story ์ถ๋ ฅ
โถ nil
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
์ ์ฝ๋ ์ฒ๋ผ ์ ์ํ ์ต์ ๋ (Int?) ๋ก ์ ์ธ๋ ๊ฐ์ nil์ ๋ฃ์ด์ฃผ๋ฉด, ์ด์ serverResponseCode์๋ ์๋ฌด๊ฐ์ด ์กด์ฌํ์ง ์๊ฒ ๋๋ค.
โถ If Statements and Forced Unwrapping
๊ฐ๋ฐ์๋ ์ต์ ๋์ ๊ฐ์ด ์๋์ง ์๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด if ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
if convertedNumber != nil {
print("convertedNumber contains some integer value.")
}
// Prints "convertedNumber contains some integer value."
์๋์ ๊ฐ์ ์กฐ๊ฑด๋ฌธ์์ ๋ณด๋ฉด, ์ถ๋ ฅํ ๋ ๋ณ์ ๋ค์ ! ๊ฐ ๋ถ์ด์๋ค. ์ด๋ ์กฐ๊ฑด๋ฌธ์์ nil๋ง๊ณ ๋ค์ด์๋ ๊ฐ์ ์ง์ ๊บผ๋ด์ด์ค๋ค.
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).")
}
// Prints "convertedNumber has an integer value of 123."
โถ Optional Binding (์ต์ ๋ ๋ฐ์ธ๋ฉ)
์ต์ ๋ ๋ฐ์ธ๋ฉ์, ์ต์ ๋์ ๊ฐ์ด ์๋์ง ๋ณธ ๋ค ์๋ค๋ฉด ํด๋น ๊ฐ์ ๊ฐ์ง๋ ์์๋ ๋ณ์๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค. if, while๋ฌธ์ด ์ฌ์ฉ๋ ์ ์๊ณ ์ฌ์ฉ๋ฒ์ ์๋ ์ฝ๋์ ๊ฐ๋ค.
if let actualNumber = Int(possibleNumber) {
print("The string \"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
print("The string \"\(possibleNumber)\" couldn't be converted to an integer")
}
// Prints "The string "123" has an integer value of 123"
possibleNumber๋ ์ต์ ๋ ๋ณ์์ด๋ค. ๋ง์ฝ possibleNumber๊ฐ nil ์ด๋ผ๋ฉด, actualNumber๋ ๋ง๋ค์ด์ง์ง ์์ ๊ฒ์ด๋ค. ์์ ์ฝ๋์์ possibleNumber๋ 123์ผ๋ก nil์ด ์๋์์ผ๋ฏ๋ก, if ์ฒซ๋ฒ์งธ ๊ตฌ๋ฌธ์ด ์ถ๋ ฅ๋์๋ค. ์์์ ์ธ๊ธํ๋ ๊ฒ์ฒ๋ผ actualNumber์๋ !๋ฅผ ๋ถ์ด์ง ์์๋ ๊ฐ์ด ์ถ๋ ฅ๋๋ค. (์..? !์ ๋ถ์ด๋์ง ๋ค์ ์ฐพ์๋ณด์)
๋ฌผ๋ก var์ ์ฌ์ฉํด์ ๋ณ์์ฒ๋ผ ์ฌ์ฉํ ์๋ ์๋ค. ๋๋ถ์ด์ ์๋ ์ฝ๋์ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ํ ๋ฒ์ ์ฌ์ฉํ ์๋ ์๋ค.
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"
(์ถ๊ฐ๋ก ์์ ์ฐ์ต)
var optionalName: String? = "ํ๊ธธ๋"
var optionalEmail: String? = "gildong@gmail.com"
if let name = optionalName, let email = optionalEmail {
// name๊ณผ email ๊ฐ์ด ์กด์ฌ
print("name is \(name) and email is \(email)")
}
// ์ถ๋ ฅ: name is ํ๊ธธ๋ and email is gildong@gmail.com
โถ Implicitly Unwrapped Optionals (์์์ ์ผ๋ก unwrap๋ ์ต์ ๋)
์ฌํ ๋ฐฐ์ด ์ง์์ ์ํ๋ฉด ์ต์
๋์ ์ฌ์ฉํ๋ ค๋ฉด if๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธํ ๋ค, ์ต์
๋ ๋ฐ์ธ๋ฉ์ผ๋ก ๊ฐ์ ์ ๊ทผํ ์ ์์๋ค. ๋ง์ฝ nil์ด ์๋ ๊ฐ์ด ์กด์ฌํ๋ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด, if let ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ํธํ ๊ฒ์ด๋ค. ์ด๋ด ๋ ๋ฐ๋ก ๊ฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก !(๋๋ํ)๋ฅผ ๋ถ์ด๋ ๊ฒ์ด๋ค.
์ต์
๋ ๋ณ์ ์ ์ธ ์, ? ๋ฅผ ๋ถ์ด๋ฉด ์์์ ์ต์
๋, !๋ฅผ ๋ถ์ด๋ฉด ๋ช
์์ ์ต์
๋์ด ๋๋ค. ! ๋ฅผ ๋ถ์ธ ์ต์
๋์ ์ฒ์ ์ ์๋ ํ์๋ ๊ฐ์ด ์กด์ฌํ๋ค๊ณ ๋ณด๊ณ , ์์ผ๋ก ๋ชจ๋ ์์ ์์ ์กด์ฌํ๋ค๊ณ ํ์ ํ๊ฒ ๋๋ค. swift์์๋ ์ฃผ๋ก ํด๋์ค๋ฅผ ์ด๊ธฐํ ํ ๋ !๋ฅผ ์ฌ์ฉํ๋ค.
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation point
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation point
forcedString ์์ possibleString ๋ค์ ! ๋ฅผ ๋ถ์ฌ์ค ์ด์ ๋, possibleString์ด ์์์ ์ต์ ๋ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ฒ์๋ถํฐ !๋ฅผ ์ฌ์ฉํด์ ๋ช ์์ ์ต์ ๋ ๋ณ์๋ก ์ฌ์ฉํ assumedString์ ! ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ก ๋ค๋ฅธ ๋ณ์์์ ์ฌ์ฉํ ์ ์๋ค.
let optionalString = assumedString
// The type of optionalString is "String?" and assumedString isn't force-unwrapped.
๋ง์ฝ ์์์ ์ผ๋ก ์ ์ธ๋ ์ต์ ๋์ด nil์ธ๋ฐ, ๋ช ์์ ์ต์ ๋์ด ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ ์ฝ๋์ฒ๋ผ string?(์์์ ์ต์ ๋) ํ์ ์ธ optionalString์ String!(๋ช ์์ ์ต์ ๋) ํ์ ์ธ assumedString์ด ์ ๊ทผํ๋ ค๊ณ ํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ ์๋์ ๊ฐ์ด if๋ฌธ์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
if let definiteString = assumedString {
print(definiteString)
}
// Prints "An implicitly unwrapped optional string."
Error Handling
Error handling ์ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ ์กฐ๊ฑด์ ๋์ํ ์ ์๋ค. function์ ์ฑ๊ณต ๋๋ ์คํจ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ๊ฐ์ ์ ๋ฌด๋ฅผ ์ฌ์ฉํ ์ ์๋ optional(์ต์ ๋)๊ณผ ๋ฌ๋ฆฌ, error handling์ ๊ฐ๋ฐ์๊ฐ ๊ทผ๋ณธ์ ์ธ ์คํจ ์์ธ์ ๊ฒฐ์ ํ ์ ์๊ฒ ํ๋ฉฐ, ํ์ํ๋ค๋ฉด ์ค๋ฅ๋ฅผ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์ผ๋ก ์ ํํ ์ ์๊ฒ ํ๋ค.
function์ด ์๋ฌ ์กฐ๊ฑด์ ๋ง๋๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ , ๊ทธ๋ฌ๋ฉด ํด๋น ํจ์์ ํธ์ถ์๊ฐ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ณ ์ ์ ํ๊ฒ ์๋ตํ ์ ์์ ๊ฒ์ด๋ค.
func canThrowAnError() throws {
// this function may or may not throw an error
}
๋ง์ฝ ํจ์์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด throws ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผ ๋์ง ์ ์๊ณ , try๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ๋ค์ catch๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผ ์ก์์ ๋ฐ์ํ ์ ์๋ค.
do {
try canThrowAnError()
// no error was thrown
} catch {
// an error was thrown
}
๋ง์ฝ์ canThrowAnError์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ฅ๊ฐ ์ ํ๋๊ณ catch ๊ตฌ๋ฌธ์ด ์คํ๋๊ฒ ๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ๊ทธ๋ฅ ํจ์๋ฅผ ์ํํ๋ค. do ๊ตฌ๋ฌธ์ ์ผ๋จ ๊ทธ๋ฅ ์คํํด๋ณด๋ ํจ์์ด๋ค.
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients)
}
์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ธ ์์์ด๋ค. makeASandwich ํจ์๋ฅผ ์คํํ๋ ค๊ณ ํ๋๋ฐ ๋ง์ฝ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด catch ๊ตฌ๋ฌธ์, ์๋๋ฉดmakeASandwich ์คํ ํ eatASandwich ํจ์๋ฅผ ์คํํ๋ค๋ ์๋ฏธ์ด๋ค. ์ฌ๊ธฐ์ SandwichError.outOfCleanDishes๋ SandwichError.missingIngredients(let ingredients)๋ ์์์๋ ์๋ต๋์์ง๋ง ๊ฐ๋ฐ์๊ฐ ๋ฏธ๋ฆฌ ์ ์ธํ ์๋ฌ์ ์ข ๋ฅ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ฆ ์๋ฌ์ ์ข ๋ฅ์ ๋ฐ๋ผ ์คํํ ์ฝ๋๋ฅผ ๋ฌ๋ฆฌํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
์๋ง ๊ณต์ ๋ฌธ์ ์ดํ์ Error Handling ๋จ์์ด ๋ฐ๋ก ์๋ค. ๊ฑฐ๊ธฐ์ ๋ ์์ธํ ๋ด์ฉ์ ๋ค๋ค๋ณด๋๋ก ํ์.
Assertions and Preconditions
Assertions and preconditions๋ ๋ฐํ์ ์ ๋ฐ์ํ๋ ๊ฒ๋ค์ ํ์ธํ๋ ๊ฒ์ด๋ค. ์ถ๊ฐ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์ฌ์ฉํด์ ์กฐ๊ฑด๋ค์ด ๋ง๋์ง ํ์ธํ ์ ์๋ค. ๋ง์ฝ ์กฐ๊ฑด๋ค์ด false๊ฐ ๋์ค๋ฉด ์ฝ๋ ์คํ์ด stop๋๊ณ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๊ฒ์ด๋ค.
Assertion์ ๊ฐ๋ฐ ๊ณผ์ ์์ ์ค์๋ฅผ ์ก์์ฃผ๊ณ , preconditions๋ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๋๋ฐ ๋์์ ์ค๋ค.
์์์ ๋ฐฐ์ด error handling๊ณผ๋ ๋ค๋ฅด๊ฒ assertions and preconditions๋ ๋ณต๊ตฌ ๊ฐ๋ฅํ๊ฑฐ๋ ์์๋๋ ์ค๋ฅ์๋ ์ฌ์ฉ๋์ง ์๋๋ค. ์ด๋ ๋ฐ๊ฒฌ ์ฆ์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ๋ฐ๋๋ก, ๋ฐ๋ก ์ฝ๋๋ฅผ ์ค๋จ์ํค๊ธฐ์ ์๋ชป๋ ์ํ๋ก ํ๋ก๊ทธ๋จ์ด ์งํ๋๋ ์ํฉ์ ๋ง์ ์ ์๋ค. ๋ํ ํ๋ก๊ทธ๋จ ์ข ๋ฃ๋ฅผ ์์ผ๋ฒ๋ฆฌ๋ฏ๋ก ์ค๋ฅ๋ฅผ ์ฝ๊ฒ ๋๋ฒ๊น ํ ์ ์๋ค.
Assertions๊ณผ Precondition์ ์กฐ๊ฑด๋ค์ ํ์ธํ ๋ ์ฐจ์ด๊ฐ ๋๋ค.. Asserions๋ ๋๋ฒ๊ทธ ๋น๋์์๋ง ์ฒดํฌ๋ฅผ ํ์ง๋ง Preconditions๋ ๋๋ฒ๊ทธ, ํ๋ก๋์ ๋น๋ ๋ชจ๋ ์ฒดํฌํ๋ค. ํ๋ก๋์ ๋น๋์์๋ Assertion์ด ์ฒดํฌ๋์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ก๋์ ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ Assertion์ ์ฌ์ฉํ ์ ์๋ค.
โถ Debugging with Assertions
Assertion์ assert(_:_:file:line:) ํจ์๋ก ์ฌ์ฉ๋ ์ ์๋ค. true ๋๋ false๋ก ํ๊ฐ๋๋ ์๊ณผ ์กฐ๊ฑด์ ๊ฒฐ๊ณผ๊ฐ 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.
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() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์คํจ๋ฅผ ์๋ฆด ์ ์๋ค.
Enforcing Preconditions
precondition์ ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์์ง๋ง, ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ํด์ ๋ฐ๋์ ์ฐธ์ด์ด์ผํ ๋ ์ฌ์ฉํ๋ค. precondition(_:_:file:line:) ํจ์๋ก ์ฌ์ฉํ ์ ์๊ณ ๋ง์ฝ ์กฐ๊ฑด์ด false๋ผ๋ฉด ์ค์ ํด๋ ์ค๋ฅ ๊ตฌ๋ฌธ์ ์ถ๋ ฅํ๋ค.
// In the implementation of a subscript...
precondition(index > 0, "Index must be greater than zero.")
preconditionFailure(_:file:line:) ํจ์๋ฅผ ์ฌ์ฉํด์ ์คํจ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ํ์ํ ์ ์๋ค. ๋ง์ฝ uncheckedmode(-Ounchecked) ๋ผ๋ฉด preconditions๋ ์ฒดํฌ๋์ง ์๋๋ค. ์ด๋ ์ปดํ์ผ๋ฌ๋ ์กฐ๊ฑด๋ค์ด ๋ชจ๋ ์ฐธ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์งํํ๋ค. ๊ทธ๋ฌ๋ fatalError(_:file:line:) ํจ์๋ ์ด์ ๊ด๊ณ์์ด ํญ์ ์ฒดํฌ๋๊ณ ํ๋ก๊ทธ๋จ์ ์ค์ง์ํจ๋ค. ๊ฐ๋ฐ์๋ fatalError(_:file:line:) ํจ์๋ฅผ ๊ฐ๋ฐ ์ด๊ธฐ์ ์ฌ์ฉํ์ฌ ์น๋ช
์ ์ธ ์ค๋ฅ์ ๋ํด ํญ์ ์ค์ง๋๋๋ก ์ค์ ํ ์ ์๋ค.
๋ง๋ฌด๋ฆฌ
๊ณต์๋ฌธ์๊ฐ .. ์ฐธ ๊ธธ๋ค... ๊ทผ๋ฐ ๋ค์๊ธ ๊ธฐ์ด๋ถํฐ ์์ํด์ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ชจ๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ์๊ณ ๊ฐ์ผํ๋ค๊ณ ๊นจ๋ฌ์๋ค. ํ๋ํ๋ ์ค๋ช ์ ์ด๋ ๊ฒ ํด์ํ๋ฉด์ ๊ณต๋ถํ๊ฑด.. ํ์ด์ฌ๋ ์ํ๋ ๊ฑด๋ฐ ํจ์ฌ ๊ฐ๋ ์ด ์ ์กํ๊ธฐ๋ ํ๊ฒ๊ฐ๋ค. ์๊ฐ๋ณด๋ค ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ค์ ํ๋ฃจ์ ํ๋์ฉ ํฌ์คํ ํด๋ณด๋ ค๊ณ ํ๋ค. 28๊ฐ์ ๋จ์์ด ์์ผ๋, ํ๋ฌ์ ์ก์์ผ๊ฒ ๋ค :)
๋ณธ ํฌ์คํ ์ https://icksw.tistory.com/2?category=876233 ํ๊ตฌ๋์ ๋ธ๋ก๊ทธ๋ก ๋ถํฐ ์ดํด๊ฐ ์๋๋ ๋ถ๋ถ์ ์ฐธ๊ณ ํ์๊ณ , apple์ swift ๊ณต์๋ฌธ์ ๋ฅผ papago ๊ธฐ์ค์ผ๋ก ๋ฒ์ญํ์ฌ ์์ฑ๋์์ต๋๋ค.