Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift Documents

[Swift] ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ (1) - The Basics

๊ฐ์ž ๐Ÿฅ” 2022. 1. 3. 12:44
๋ฐ˜์‘ํ˜•

์‹œ์ž‘ํ•˜๋ฉฐ

Swift์— ๋Œ€ํ•ด์„œ ์ฒ˜์Œ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ์‹œ์ž‘์€ ์ •์„๋ถ€ํ„ฐ! Swift ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์ฐจ๊ทผ์ฐจ๊ทผ swift์–ธ์–ด์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด๋ ค๊ณ  ํ•œ๋‹ค. 

Swift ๊ณต์‹ Documents - The Basics

๋ฐ˜์‘ํ˜•
 

The Basics — The Swift Programming Language (Swift 5.5)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

 


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 ๊ธฐ์ค€์œผ๋กœ ๋ฒˆ์—ญํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•