λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • Dev Blog
iOS/Swift

[Swift] κΈ°λ³Έ (The Basics)

by μœ μ§„μ˜ 2024. 10. 24.

참고 자료

 

κΈ°λ³Έ (The Basics) - Swift

νŠΉμ • 크기의 μ •μˆ˜λ‘œ μž‘μ—…ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ 항상 μ½”λ“œμ˜ μ •μˆ˜ 값을 μ‚¬μš©ν•  λ•Œ Int λ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. 이것은 μ½”λ“œ 일관성과 μƒν˜Έ μš΄μš©μ„±μ„ μ§€μ›ν•©λ‹ˆλ‹€. 32-bit ν”Œλž«νΌμ—μ„œλ„ Int λŠ” -2,147,483,6

bbiguduk.gitbook.io

 

Swift 곡식 λ¬Έμ„œλ₯Ό ν•œκ΅­μ–΄λ‘œ λ²ˆμ—­ν•œ μ‚¬μ΄νŠΈμž…λ‹ˆλ‹€.

πŸ’»  μ°Έκ³  자료의 λͺ¨λ“  λ‚΄μš©μ„ λ‹€λ£¨λŠ” 것이 μ•„λ‹ˆλΌ κ³΅λΆ€ν•˜λ©΄μ„œ μƒˆλ‘­κ²Œ μ•Œκ²Œ 된 점 μœ„μ£Όλ‘œ μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ°Έκ³  μžλ£Œμ΄μ™Έμ—λ„ μΆ”κ°€μ μœΌλ‘œ κ³΅λΆ€ν•œ 뢀뢄도 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.


 

μƒμˆ˜μ™€ λ³€μˆ˜ (Constants and Variables)

μ—¬λŸ¬ 개의 μƒμˆ˜ λ˜λŠ” μ—¬λŸ¬ 개의 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ 콀마둜 κ΅¬λΆ„ν•˜μ—¬ ν•œμ€„λ‘œ 선언이 κ°€λŠ₯ν•˜λ‹€.

var x = 0.0, y = 0.0, z = 0.0

 

νƒ€μž… λͺ…μ‹œ (Type Annotations)

var welcomeMessage1: String // νƒ€μž… λͺ…μ‹œ
var welcomeMessage2 = "Welcome!" // νƒ€μž… μΆ”λ‘ 

 

νƒ€μž… μΆ”λ‘  vs νƒ€μž… λͺ…μ‹œ

κ°„ν˜Ή νƒ€μž… μΆ”λ‘ κ³Ό νƒ€μž… λͺ…μ‹œμ˜ 차이λ₯Ό μ„€λͺ…ν•˜λ©΄μ„œ λ‘˜ κ°„μ˜ 속도 비ꡐλ₯Ό ν•˜λŠ” 글듀이 μ‘΄μž¬ν•œλ‹€. νƒ€μž… μΆ”λ‘ μ˜ 경우 'νƒ€μž… λͺ…μ‹œμ™€ λΉ„κ΅ν•˜μ—¬ Swift μ»΄νŒŒμΌλŸ¬κ°€ ν•΄λ‹Ή μƒμˆ˜λ‚˜ λ³€μˆ˜μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•˜λŠ” 데에 μ‹œκ°„μ΄ 더 걸리지 μ•Šμ„κΉŒ' λΌλŠ” ꢁ금증 λ•Œλ¬Έμ— μ΄λŸ¬ν•œ 속도 비ꡐλ₯Ό ν•œ 것 κ°™λ‹€.

ν•˜μ§€λ§Œ, λŒ€λΆ€λΆ„μ˜ 글듀이 μ•„λž˜μ™€ 같은 μ½”λ“œλ‘œ μ‹€ν–‰μ‹œκ°„μ„ λΉ„κ΅ν•˜κ³  μžˆμ—ˆλ‹€. 

func measureTime(_ closure: () -> ()) -> TimeInterval {
    let startDate = Date()
    closure()
    return Date().timeIntervalSince(startDate)
}

// νƒ€μž… μΆ”λ‘  μ‹œκ°„ 체크
measureTime {
  for i in 1...1000000 {
      let num = 0 + i
  }
}

// νƒ€μž… λͺ…μ‹œ μ‹œκ°„ 체크
measureTime {
  for i in 1...1000000 {
      let num: Int = 0 + i
  }
}

 

ν•˜μ§€λ§Œ, μ΄λŸ¬ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” 컴파일 μ‹œκ°„μ„ μ²΄ν¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ λŸ°νƒ€μž„μ—μ„œμ˜ μ‹€ν–‰ μ‹œκ°„μ„ μ²΄ν¬ν•˜λŠ” μ½”λ“œμ΄λ‹€. num μƒμˆ˜κ°€ λ°˜λ³΅λ¬Έμ„ 돌 λ•Œλ§ˆλ‹€ μƒˆλ‘œ μƒμ„±λ˜μ–΄μ§€λŠ” 것은 λ§žμ§€λ§Œ λŸ°νƒ€μž„μ—λŠ” num μƒμˆ˜μ˜ μ΄ˆκΈ°κ°’λ§Œ κ²°μ •λ˜κ³ , SwiftλŠ” μ •μ νƒ€μž… 언어라 컴파일 μ‹œκ°„μ— num μƒμˆ˜μ˜ νƒ€μž…μ΄ 이미 κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈμ˜ ꢁ극적 λͺ©μ μΈ 'Swift μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž…μ„ κ²°μ •ν•˜κΈ°κΉŒμ§€μ˜ μ‹œκ°„ 차이' μ—μ„œλŠ” λ²—μ–΄λ‚˜λŠ” ν…ŒμŠ€νŠΈ μ½”λ“œμ΄λ‹€.

 

그러면 컴파일 속도 μ°¨μ΄λŠ” μ–΄λ–¨κΉŒ? 결둠은 였히렀 νƒ€μž… 좔둠이 더 λΉ λ₯Έ 컴파일 속도λ₯Ό 보인닀고 ν•œλ‹€. μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

Swift μ»΄νŒŒμΌλŸ¬λŠ” μ΅œμ ν™” κΈ°λŠ₯이 잘 λ˜μ–΄μžˆμ–΄ μ• μ΄ˆμ— νƒ€μž… μΆ”λ‘ κ³Ό νƒ€μž… λͺ…μ‹œκ°„μ˜ 컴파일 μ„±λŠ₯ 차이가 ꡉμž₯히 λ―Έλ―Έν•˜κ³ , νƒ€μž… λͺ…μ‹œκ°€ 였히렀 λͺ…μ‹œλœ νƒ€μž…κ³Ό μ΄ˆκΈ°κ°’μ„ λΉ„κ΅ν•˜λŠ” μž‘μ—…μ΄ μΆ”κ°€λ˜μ–΄ 쑰금 더 λŠλ¦¬λ‹€κ³  ν•œλ‹€. 

 

 

νƒ€μž… μΆ”λ‘ κ³Ό νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ˜ 속도 차이에 κ΄€ν•˜μ—¬(🧐 νƒ€μž… 좔둠이 더 λΉ λ₯΄λ‹€?)

κ·Έ λ™μ•ˆ λ§‰μ—°ν•˜κ²Œλ„ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜(λͺ…μ‹œ)κ°€ 컴파일 속도가 더 λΉ λ₯΄λ‹€κ³  μƒκ°ν–ˆλ˜μ§€λΌ 아무 생각 없이 νƒ€μž… λͺ…μ‹œλ₯Ό ν•˜λŠ” μŠ΅κ΄€μ„ 듀이고 μžˆμ—ˆλ‹€. κ·ΈλŸ¬λ‚˜ 졜근 λ“£κ³  μžˆλŠ” ꡐ윑 κ³Όμ •μ—μ„œ λ©˜ν† λ‹˜κ»˜

taekki-dev.tistory.com

 

νƒ€μž… μΆ”λ‘ κ³Ό νƒ€μž… λͺ…μ‹œμ˜ μ‚¬μš© νŒλ‹¨ κΈ°μ€€

κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄, μ‚¬μš© νŒλ‹¨ 기쀀은 개인 μŠ€νƒ€μΌ ν˜Ήμ€ νŒ€μ—μ„œ μ‚¬μš©ν•˜λŠ” μ»¨λ²€μ…˜μ— 따라 λ‹¬λΌμ§ˆ 수 μžˆλ‹€. 즉, 컴파일 μ‹œκ°„μ΄ ν¬λ¦¬ν‹°μ»¬ν•œ μ΄μŠˆκ°€ 될 μ •λ„λ‘œ μ‚¬μ΄μ¦ˆκ°€ κ±°λŒ€ν•œ ν”„λ‘œμ νŠΈμ΄λ©΄ λ˜λ„λ‘ νƒ€μž… 좔둠을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μ§€λ§Œ, 그것이 μ•„λ‹ˆλΌλ©΄ 뭘 μ‚¬μš©ν•΄λ„ μƒκ΄€μ—†λ‹€λŠ” 것이닀.

 

ν•˜μ§€λ§Œ, κΌ­ νƒ€μž… λͺ…μ‹œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•  κ²½μš°κ°€ μžˆλ‹€.

  • μ΄ˆκΈ°κ°’κ³Ό λ‹€λ₯Έ νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ°λ₯Ό 원할 λ•Œ
let one = 1
print(type(of: one)) // Int

let two: Double = 2
print(two) // 2.0

let a = "A"
print(type(of: a)) // String

let b: Character = "B"
print(type(of: b)) // Character

 

  • μƒμˆ˜λ‚˜ λ³€μˆ˜λ₯Ό 선언은 ν–ˆμ§€λ§Œ, 아직 값을 ν• λ‹Ήν•˜κ³  싢지 μ•Šμ„ λ•Œ
var totalWeight: Int
let leftDumbbellWeigth = 10
let rightDumbbellWeight = 10
let isAssemble = true

if isAssemble {
   totalWeigth = leftDumbbellWeigth + rightDumbbellWeight
} else {
   totalWeigth = 0
}

 

μœ„ 두 가지 상황이 아닐 λ•Œμ—λŠ” νƒ€μž… 좔둠을 μ‚¬μš©ν•˜λ“  νƒ€μž… λͺ…μ‹œλ₯Ό μ‚¬μš©ν•˜λ“  μ–΄λ””κΉŒμ§€λ‚˜ 개인의 μŠ€νƒ€μΌμ΄λ‹€. ν•„μžλŠ” ν˜‘μ—…μ„ ν•  λ•Œ μ€‘μš”ν•œ 역할을 ν•˜λŠ” μƒμˆ˜λ‚˜ λ³€μˆ˜μ—λŠ” νƒ€μž… λͺ…μ‹œλ₯Ό μ‚¬μš©ν•˜κ³  λ³„λ‘œ μ€‘μš”ν•˜μ§€ μ•Šμ€ μƒμˆ˜λ‚˜ λ³€μˆ˜μ—λŠ” νƒ€μž… 좔둠을 μ‚¬μš©ν•œλ‹€.

 

μ„Έλ―Έμ½œλ‘ 

λ§Žμ€ 언어와 λ‹€λ₯΄κ²Œ SwiftλŠ” μ½”λ“œμ˜ 각 ꡬ문 뒀에 μ„Έλ―Έμ½œλ‘ μ΄ ν•„μˆ˜κ°€ μ•„λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ—¬λŸ¬ ꡬ문을 ν•œμ€„λ‘œ μž‘μ„±ν•  경우 μ„Έλ―Έμ½œλ‘ μ€ ν•„μˆ˜λ‘œ μž‘μ„±λ˜μ–΄μ•Όν•œλ‹€.

let cat = "🐱"; print(cat)
// Prints "🐱"

 

 

μ •μˆ˜

  • λΆ€ν˜Έ μžˆλŠ” μ •μˆ˜ νƒ€μž…
Int8, Int32, Int64, Int

 

IntλŠ” 32-bit ν”Œλž«νΌμ—μ„œλŠ” Int32, 64-bit ν”Œλž«νΌμ—μ„œλŠ” Int64와 같은 크기λ₯Ό 가진닀.

 

  • λΆ€ν˜Έ μ—†λŠ” μ •μˆ˜ νƒ€μž…
UInt8, UInt32, UInt64, UInt

 

UInt도 Int와 λ™μΌν•˜κ²Œ ν”Œλž«νΌμ— 따라 μžλ™μœΌλ‘œ λ§žμΆ€ν˜• 크기λ₯Ό 가진닀.

 

  • 각 νƒ€μž…μ΄ ν‘œν˜„ν•  수 μžˆλŠ” μ΅œλŒ€, μ΅œμ†Œκ°’ 확인
print(Int.max) // 9223372036854775807 (64-bit ν”Œλž«νΌμ—μ„œμ˜ μ΅œλŒ€ 크기 == Int64.max)
print(Int.min) // -9223372036854775808

print(Int32.max) // 2147483647
print(Int32.min) // -2147483648

print(UInt8.max) // 255
print(UInt8.min) // 0

 

β€» μ™œ μŒμˆ˜κ°€ μ–‘μˆ˜λ³΄λ‹€ ν‘œν˜„κ°’μ΄ ν•˜λ‚˜ 더 λ§Žμ€κ°€

더보기

μ»΄ν“¨ν„°μ—μ„œλŠ” 음수λ₯Ό 2의 보수둜 ν‘œν˜„ν•œλ‹€. μ΄μ§„μˆ˜μ˜ 음수 ν‘œν˜„ 방식 쀑 λΆ€ν˜Έμ™€ μ ˆλŒ“κ°’, 1의 λ³΄μˆ˜λŠ” 0을 +0, -0κ³Ό 같이 두 κ°€μ§€λ‘œ ν‘œν˜„ ν•œλ‹€. 즉, λΆ€ν˜Έ λΉ„νŠΈκ°€ 0일 λ•Œμ™€ λΆ€ν˜Έ λΉ„νŠΈκ°€ 1일 λ•Œ 0을 μ˜λ―Έν•˜λŠ” μ΄μ§„μˆ˜κ°€ λ‘˜ λ‹€ μ‘΄μž¬ν•œλ‹€λŠ” 것이닀. 반면, 2의 λ³΄μˆ˜λŠ” λΆ€ν˜Έ λΉ„νŠΈκ°€ 0일 λ•Œ 0을 μ˜λ―Έν•˜λŠ” μ΄μ§„μˆ˜λ§Œ μ‘΄μž¬ν•œλ‹€. λ”°λΌμ„œ, μžμ—°μŠ€λ ˆ λΆ€ν˜Έ λΉ„νŠΈκ°€ 1인 κ²½μš°μ— ν‘œν˜„ν•  수 μžˆλŠ” 값이 ν•˜λ‚˜ 더 늘게 λœλ‹€. (8bit인 경우 10000000)

 

  • μ •μˆ˜ λ¦¬ν„°λŸ΄
let decimalInteger = 17
let binaryInteger = 0b10001       // 17의 μ΄μ§„μˆ˜ ν‘œκΈ°λ²•
let octalInteger = 0o21           // 17의 8μ§„μˆ˜ ν‘œκΈ°λ²•
let hexadecimalInteger = 0x11     // 17의 16μ§„μˆ˜ ν‘œκΈ°λ²•

let oneMillion = 1_000_000        // 가독성을 μœ„ν•œ 밑쀄 포함 κ°€λŠ₯

 

 

뢀동 μ†Œμˆ˜μ  숫자

  • Double 
    • 64-bit 뢀동 μ†Œμˆ˜μ  숫자 ν‘œκΈ°
    • μ΅œμ†Œ 15자리 μ†Œμˆ˜μ  정확도
  • Float
    • 32-bit 뢀동 μ†Œμˆ˜μ  숫자 ν‘œκΈ°
    • μ΅œμ†Œ 6자리 정확도

β€» λΆ€λ™ μ†Œμˆ˜μ 

더보기

μ»΄ν“¨ν„°μ—μ„œ 이진 μ†Œμˆ˜λ₯Ό λ‹€λ£° λ•Œμ—λŠ” 두 가지 방식이 μ‘΄μž¬ν•œλ‹€. 첫 λ²ˆμ§ΈλŠ” 32-bit κΈ°μ€€ μ΅œμƒμœ„ 1λΉ„νŠΈλ₯Ό λΆ€ν˜Έ, κ·Έ λ‹€μŒ 15λΉ„νŠΈλ₯Ό μ •μˆ˜λΆ€, 남은 16λΉ„νŠΈλ₯Ό μ†Œμˆ˜λΆ€λ‘œ ν‘œν˜„ν•˜λŠ” κ³ μ • μ†Œμˆ˜μ  방식이닀. μ΄λŸ¬ν•œ κ³ μ • μ†Œμˆ˜μ  방식은 λ‹€λ£° 수 μžˆλŠ” λΉ„νŠΈμ˜ μˆ˜κ°€ ν•œμ •λ˜μ–΄μžˆμ–΄ 더 λ§Žμ€ ν‘œν˜„μ„ ν•  수 μ—†λ‹€λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

 

μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•œ 방식이 λ°”λ‘œ 뢀동 μ†Œμˆ˜μ μ΄λ‹€. λ¨Όμ €, 십진 μ†Œμˆ˜λ₯Ό 이진 μ†Œμˆ˜λ‘œ λ°”κΎΌ 것을 μ •κ·œν™”λ₯Ό κ±°μΉœλ‹€. μ •κ·œν™”λœ 이진 μ†Œμˆ˜λŠ” ±(1.κ°€μˆ˜λΆ€)×2^μ§€μˆ˜λΆ€-127 둜 ν‘œν˜„λœλ‹€. 이 μ •κ·œν™”λ₯Ό 거친 수λ₯Ό 32-bit κΈ°μ€€ μ΅œμƒμœ„ 1λΉ„νŠΈλ₯Ό λΆ€ν˜Έ, κ·Έ λ‹€μŒ 8λΉ„νŠΈλ₯Ό μ§€μˆ˜λΆ€, 남은 23λΉ„νŠΈλ₯Ό κ°€μˆ˜λΆ€λ‘œ ν‘œν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ 더 λ§Žμ€ ν‘œν˜„μ„ ν•  수 있게 λœλ‹€.

 

Floatν˜•μ΄ 32-bit 뢀동 μ†Œμˆ˜μ  숫자λ₯Ό ν‘œκΈ°ν•˜λŠ”λ° μ‚¬μš©λ˜κ³ , Doubleν˜•μ΄ 64-bit 뢀동 μ†Œμˆ˜μ  숫자λ₯Ό ν‘œκΈ°ν•œλ‹€. 64-bit 뢀동 μ†Œμˆ˜μ μ€ μ΅œμƒμœ„ 1λΉ„νŠΈλ₯Ό λΆ€ν˜Έ, κ·Έ λ‹€μŒ 11λΉ„νŠΈλ₯Ό μ§€μˆ˜λΆ€, 남은 52λΉ„νŠΈλ₯Ό κ°€μˆ˜λΆ€λ‘œ ν‘œν˜„ν•˜μ—¬ Floatν˜•λ³΄λ‹€ 더 높은 정밀도λ₯Ό 가지고 μ†Œμˆ˜λ₯Ό ν‘œν˜„ν•  수 μžˆλ‹€.

 

β€» 뢀동 μ†Œμˆ˜μ  였차

더보기
print(1.1 + 0.1 == 1.2) // false

 

Swift 뿐만 μ•„λ‹ˆλΌ IEEE 754 ν‘œμ€€ 뢀동 μ†Œμˆ˜μ  방식을 μ‚¬μš©ν•˜κ³  μžˆλŠ” λͺ¨λ“  ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” μœ„μ™€ 같은 κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€. μ™œλƒν•˜λ©΄, 뢀동 μ†Œμˆ˜μ μ„ μ΄μš©ν•˜μ—¬ μ†Œμˆ˜λ₯Ό ν‘œν˜„ν•  λ•Œ μ˜€μ°¨κ°€ 생기기 λ•Œλ¬Έμ΄λ‹€.

 

μ˜€μ°¨κ°€ μƒκΈ°λŠ” μ΄μœ λŠ” κ°„λ‹¨ν•˜λ‹€. 1/3을 십진 μ†Œμˆ˜μ μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ 0.3333... κ³Ό 같이 λ¬΄ν•œμ†Œμˆ˜λ‘œ ν‘œν˜„λ˜λŠ” κ²ƒμ²˜λŸΌ λ‹€λ₯Έ μ§„λ²•μ—μ„œλ„ λ¬΄ν•œμ†Œμˆ˜κ°€ λ˜λŠ” μˆ˜λ“€μ΄ μ‘΄μž¬ν•œλ‹€. 이진법 같은 κ²½μš°μ—λŠ” μ‹­μ§„μˆ˜ 0.1을 이진 μ†Œμˆ˜μ μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ 0.001100110011... κ³Ό 같이 λ¬΄ν•œμ†Œμˆ˜λ‘œ ν‘œν˜„λœλ‹€. μ΄λŸ¬ν•œ λ¬΄ν•œμ†Œμˆ˜λ₯Ό μ»΄ν“¨ν„°μ—μ„œ λ‹€λ£°λ €λ©΄ 32-bit(Float) ν˜Ήμ€ 64-bit(Double)둜 닀뀄야 ν•˜λŠ”λ° λ‹Ήμ—°νžˆ 32bit ν˜Ήμ€ 64bit μ΄ν›„μ˜ 값듀이 μƒλž΅λ˜κΈ° λ•Œλ¬Έμ— μ˜€μ°¨κ°€ λ°œμƒν•  수 밖에 μ—†λ‹€.

 

λ”μš± μ‰½κ²Œ μ–˜κΈ°ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. 쀑고등학ꡐ μˆ˜ν•™ 문제λ₯Ό ν’€ λ•Œ 보톡 λ¬΄ν•œμ†Œμˆ˜μΈ π의 값을 3.14라 μ§€μ •ν•˜κ³  계산을 ν•˜κ²Œλœλ‹€. λ”°λΌμ„œ, π + 1 = 4.14 μ΄μ§€λ§Œ, μ‹€μ œλ‘œλŠ” 그렇지 μ•Šκ³  μƒλž΅λœ μ†Œμˆ˜μ λ§ŒνΌ μ˜€μ°¨κ°€ 생긴닀. μ΄λŸ¬ν•œ 일듀이 컴퓨터 λ‚΄μ—μ„œλ„ λ²Œμ–΄μ§€κ³  μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ μ΄ν•΄ν•˜κΈ° μ‰¬μšΈ 것 κ°™λ‹€.

 

λ”°λΌμ„œ, μ†Œμˆ˜λ₯Ό λ‹€λ£¨λŠ” ν”„λ‘œκ·Έλž˜λ°μ€ μ΄λŸ¬ν•œ 였차λ₯Ό 항상 염두해두고 μžˆμ–΄μ•Όν•œλ‹€.

 

  • 뢀동 μ†Œμˆ˜μ  λ¦¬ν„°λŸ΄
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1	// 12.1875λ₯Ό μ§€μˆ˜κ°€ 1인 10μ§„μˆ˜λ‘œ ν‘œκΈ°

let paddedDouble = 000123.456   // μ•žλΆ€λΆ„μ— 0을 μ±„μ›Œλ„ 문제 μ—†μŒ
let justOverOneMillion = 1_000_000.000_000_1  // μ†Œμˆ˜λΆ€λ„ λ§ˆμ°¬κ°€μ§€λ‘œ 가독성을 μœ„ν•΄ 밑쀄 포함 κ°€λŠ₯

 

  • μ •μˆ˜μ™€ 뢀동 μ†Œμˆ˜μ  λ³€ν™˜
let pi = 3.14159 // Double둜 νƒ€μž… μΆ”λ‘ 
let anotherPi = 3 + 0.14159 // λ§ˆμ°¬κ°€μ§€λ‘œ Double둜 νƒ€μž… μΆ”λ‘ 

let three = 3 // Int둜 νƒ€μž… μΆ”λ‘ 
let pointOneFourOneFiveNine = 0.14159 // Double둜 νƒ€μž… μΆ”λ‘ 
let pi = three + pointOneFourOneFiveNine // Error: Int + Double λΆˆκ°€
let pi = Double(three) + pointOneFourOneFiveNine // 3.14159

let integerPi = Int(pi) // 3

 

각각 λ‹€λ₯Έ νƒ€μž…λΌλ¦¬μ˜ 연산은 λΆˆκ°€ν•˜μ—¬ μ„œλ‘œ 같은 νƒ€μž…λΌλ¦¬μ˜ 연산이 되게 λ³€ν™˜ν•΄μ•Ό ν•œλ‹€. μ΄λ•Œ, 뢀동 μ†Œμˆ˜μ  값은 μ •μˆ˜ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•  λ•Œ μ†Œμˆ˜μ  μ•„λž˜λ₯Ό λ²„λ¦Όν•œλ‹€. 예λ₯Ό λ“€μ–΄, 4.75λŠ” 4, -3.9λŠ” -3이 λœλ‹€.

 

νŠœν”Œ

νŠœν”Œμ€ ν•˜λ‚˜μ˜ νŠœν”Œμ— 각각 λ‹€λ₯Έ νƒ€μž…μ˜ 값듀을 담을 수 μžˆμ–΄ λ°˜ν™˜ 값이 μ—¬λŸ¬ 개인 ν•¨μˆ˜μ— μœ μš©ν•˜κ²Œ μ‚¬μš©λœλ‹€.

 

  • νŠœν”Œμ˜ λΆ„ν•΄(decompose)
let http404Error = (404, "Not Found")

let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)") // 404
print("The status message is \(statusMessage)") // Not Found

let (justTheStatusCode, _) = http404Error // _ 을 μ‚¬μš©ν•˜μ—¬ λ¬΄μ‹œν•  수 있음
print("The status code is \(justTheStatusCode)")

// 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠœν”Œμ˜ κ°œλ³„ μš”μ†Œ μ ‘κ·Ό
print("The status code is \(http404Error.0)") // 404
print("The status message is \(http404Error.1)") // Not Found

 

  • Named Tuple
let http200Status = (statusCode: 200, description: "OK")

print("The status code is \(http200Status.statusCode)") // 200
print("The status message is \(http200Status.description)") // OK

print(type(of: http200Status)) // (statusCode: Int, description: String)

 

μ˜΅μ…”λ„

μ˜΅μ…”λ„μ€ Swift μ–Έμ–΄μ˜ 꽃이라 ν•  수 μžˆμœΌλ―€λ‘œ 쑰금 더 μžμ„Έν•˜κ²Œ 닀루고 μ‹Άμ–΄ λ‹€λ₯Έ 글을 μ°Έκ³ ν•΄μ£ΌκΈΈ λ°”λž€λ‹€.

 

μ—λŸ¬ 처리

func canThrowAnError() throws {
    // this function may or may not throw an error
}

 

throws ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή ν•¨μˆ˜λŠ” μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆμŒμ„ λ‚˜νƒ€λ‚΄μ•Ό ν•œλ‹€. μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” ν‘œν˜„μ‹ μ•žμ— try ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ•Ό ν•œλ‹€. ν•¨μˆ˜ ν˜ΈμΆœμ„ do ꡬ문으둜 λž˜ν•‘ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•  λ•Œ catch 절둜 μ „νŒŒλœλ‹€.

 

func makeASandwich() throws {
    // ...
}

do {
    try makeASandwich()
    eatASandwich()
} catch SandwichError.outOfCleanDishes {
    washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
    buyGroceries(ingredients)
}

 

μžμ„Έν•œ μ—λŸ¬ λ°œμƒ, 포착, μ „νŒŒλŠ” μ—λŸ¬ 처리 νŒŒνŠΈμ—μ„œ λ‹€λ£° 것이닀.

 

μ—­μ„€κ³Ό μ „μ œμ‘°κ±΄

μ—­μ„€κ³Ό μ „μ œμ‘°κ±΄μ€ λŸ°νƒ€μž„μ‹œ μΆ”κ°€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 ν•„μˆ˜ 쑰건이 μΆ©μ‘±λ˜λŠ” 지 확인할 수 μžˆλŠ” 디버깅 문법이닀. 역섀은 였직 디버그 λΉŒλ“œμ—μ„œλ§Œ 체크되고, μ „μ œμ‘°κ±΄μ€ 디버그와 ν”„λ‘œλ•μ…˜ λΉŒλ“œ λͺ¨λ‘μ—μ„œ μ²΄ν¬λœλ‹€. 즉, 역섀은 개발 쀑에 μ‹€μˆ˜λ‚˜ 잘λͺ»λœ 가정을 μ°ΎλŠ” 데 도움이 되고 μ „μ œμ‘°κ±΄μ€ ν”„λ‘œλ•μ…˜μ—μ„œ 이슈λ₯Ό λ°œκ²¬ν•˜λŠ” 데 도움이 λœλ‹€.

 

  • 역섀을 ν†΅ν•œ 디버깅
let age = -3
assert(age >= 0, "A person's age can't be less than zero.")
// ν”„λ‘œκ·Έλž¨ μ’…λ£Œ ν›„ "Assertion failed: A person's age can't be less than zero." μ—λŸ¬ λ©”μ„œμ§€ 좜λ ₯

 

 

μ½”λ“œκ°€ 이미 쑰건이 μ²΄ν¬λ˜μ—ˆλ‹€λ©΄ assertionFailure() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 좜λ ₯ν•  μ—λŸ¬ 메세지λ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

 

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.")
}

 

  • μ „μ œμ‘°κ±΄
let array = [1, 2, 3, 4]
let index = -1

precondition(index > 0, "Index must be greater than zero.")
// ν”„λ‘œκ·Έλž¨ μ’…λ£Œ ν›„ "Precondition failed: Index must be greater than zero." μ—λŸ¬ λ©”μ‹œμ§€ 좜λ ₯
print(array[index])

 

λ§ˆμ°¬κ°€μ§€λ‘œ, 이미 쑰건이 μ²΄ν¬λ˜μ—ˆλ‹€λ©΄ preconditionFailure() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 좜λ ₯ν•  μ—λŸ¬ 메세지λ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

 

λŒ“κΈ€