Potato
μ•ˆλ…•ν•˜μ„Έμš”, κ°μž‘λ‹ˆλ‹€?πŸ₯” ^___^ 😺 github λ°”λ‘œκ°€κΈ° πŸ‘‰πŸ»

Swift/Swift Documents

[Swift] 곡식 λ¬Έμ„œ 정리 (21)- Extenstions (ν™•μž₯, μ΅μŠ€ν…μ…˜, ν™•μž₯ κΈ°λŠ₯)

감자 πŸ₯” 2022. 3. 11. 02:51
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”, κ°μžμž…λ‹ˆλ‹€. μ˜€λŠ˜μ€ Extension에 λŒ€ν•΄μ„œ 곡뢀해본 λ‚΄μš©μ„ μ •λ¦¬ν–ˆμ–΄μš”. 그럼 μ‹œμž‘!

Swift Document chap.21 Extension λ°”λ‘œκ°€κΈ°

 

Extensions — The Swift Programming Language (Swift 5.6)

Extensions Extensions add new functionality to an existing class, structure, enumeration, or protocol type. This includes the ability to extend types for which you don’t have access to the original source code (known as retroactive modeling). Extensions

docs.swift.org


 

Extensions (ν™•μž₯, μ΅μŠ€ν…μ…˜)

Extension(μ΅μŠ€ν…μ…˜, ν™•μž₯)은 기쑴의 ν΄λž˜μŠ€λ‚˜, ꡬ쑰체, μ—΄κ±°ν˜• λ˜λŠ” ν”„λ‘œν† μ½œ νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” κΈ°λŠ₯이닀. μ΄λŠ” μ‹€μ œλ‘œ ν•΄λ‹Ή νƒ€μž…λ“€μ΄ μ •μ˜λœ μ½”λ“œμ— μ ‘κ·Όν•  수 없을 λ•Œμ—λ„ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

Swift의 μ΅μŠ€ν…μ…˜μ€ λ‹€μŒκ³Ό 같은 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

  • μΈμŠ€ν„΄μŠ€μ˜ 계산 ν”„λ‘œνΌν‹°μ™€ 계산 νƒ€μž… ν”„λ‘œνΌν‹° μΆ”κ°€
  • μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ νƒ€μž… λ©”μ„œλ“œ μ •μ˜
  • μ„œλΈŒ 슀크립트 μ •μ˜
  • μƒˆλ‘œμš΄ 쀑첩 νƒ€μž… μ •μ˜
  • κΈ°μ‘΄ μœ ν˜•μ΄ νŠΉμ • ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λ„λ‘ λ§Œλ“€μ–΄ μ£ΌκΈ°

Swiftμ—μ„œλŠ” ν”„λ‘œν† μ½œμ„ ν™•μž₯ν•˜μ—¬ μš”κ΅¬μ‚¬ν•­μ˜ κ΅¬ν˜„μ„ μ œκ³΅ν•˜κ±°λ‚˜ ν”„λ‘œν† μ½œμ— μΆ”κ°€ κΈ°λŠ₯을 μΆ”κ°€ν•  μˆ˜λ„ μžˆλ‹€. ν™•μž₯으둜 νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  μˆ˜λŠ” μžˆμ§€λ§Œ 기쑴의 κΈ°λŠ₯을 μ˜€λ²„λΌμ΄λ“œ ν•  μˆ˜λŠ” μ—†λ‹€.

 

Extension Syntax

μ΅μŠ€ν…μ…˜μ€ extension ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œλ‹€.

extension SomeType {
  // SomeType 에 μΆ”κ°€ν•  μƒˆλ‘œμš΄ κΈ°λŠ₯은 여기에 λ‘‘λ‹ˆλ‹€.
} 

 

μ΅μŠ€ν…μ…˜μ€ κΈ°μ‘΄ νƒ€μž…μ„ ν™•μž₯ν•˜μ—¬ ν•˜λ‚˜ μ΄μƒμ˜ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ²Œ ν•  수 μžˆλ‹€. μ΄λ ‡κ²Œ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κΈ° μœ„ν•΄μ„œλŠ” 클래슀, κ΅¬μ‘°μ²΄μ—μ„œ μ±„νƒν•˜λŠ” λ°©γ……νž‰κ³Ό λ™μΌν•œ λ°©μ‹μœΌλ‘œ ν”„λ‘œν† μ½œ 이름을 μž‘μ„±ν•˜λ©΄ λœλ‹€.

extension SomeType: SomeProtocol, AnotherProtocol {
  // ν”„λ‘œν† μ½œμ˜ ν•„μˆ˜ 쑰건 κ΅¬ν˜„μ€ 여기에 λ‘‘λ‹ˆλ‹€.
}

μ΄λ ‡κ²Œ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜λŠ” μžμ„Έν•œ 방법은 chap.22 ν”„λ‘œν† μ½œ μ—μ„œ λ°°μš°λ„λ‘ ν•˜μž.

μ΅μŠ€ν…μ…˜μ€ μ‘΄μž¬ν•˜λŠ” generic νƒ€μž…μ—λ„ μ μš©ν•  수 μžˆλ‹€. Generic에 μ΅μŠ€ν…μ…˜μ„ μ μš©ν•˜λŠ” 방법은 chap.23 Generic μ—μ„œ μ‚΄νŽ΄λ³΄μž.

λ§Œμ•½ μ΅μŠ€ν…μ…˜μ„ μ‚¬μš©ν•˜μ—¬ κΈ°μ‘΄ νƒ€μž…μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜λ©΄, μΆ”κ°€ν•˜κΈ° 전에 μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ“€λ„ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ‹€.


 

1. Extension으둜 계산 ν”„λ‘œνΌν‹° (Computed Properties) μΆ”κ°€ ν•˜κΈ°

μ΅μŠ€ν…μ…˜μ€ κΈ°μ‘΄ νƒ€μž…μ— 계산 ν”„λ‘œνΌν‹°, 계산 νƒ€μž… ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.

λ‹€μŒ μ˜ˆμ œλŠ” Double νƒ€μž…μ— λ‹€μ„―κ°œμ˜ 계산 μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•œ μ½”λ“œμ΄λ‹€.

extension Double {
  var km: Double { return self * 1_000.0 }
  var m: Double { return self }
  var cm: Double { return self / 100.0 }
  var mm: Double { return self / 1_000.0 }
  var ft: Double { return self / 3.28084 }
}

let oneInch = 25.4.mm
print("One inch is \\(oneInch) meters")
// "One inch is 0.0254 meters" λ₯Ό 인쇄함

let threeFeet = 3.ft
print("Three feet is \\(threeFeet) meters")
// "Three feet is 0.914399970739201 meters" λ₯Ό 인쇄함

▢️ μ½”λ“œμ„€λͺ…

이 계산 ν”„λ‘œνΌν‹°λ“€μ€ Double 값이 νŠΉμ • 길이 λ‹¨μœ„λ‘œ κ³ λ €λ˜μ–΄μ•Ό 함을 ν‘œν˜„ν•œλ‹€. 계산 ν”„λ‘œνΌν‹°λ‘œ κ΅¬ν˜„λ˜κΈ΄ ν–ˆμ§€λ§Œ, λΆ€λ™μ†Œμˆ˜μ  κΈ€μž 값을 μ¨μ„œ 거리 λ³€ν™˜μ„ ν•˜λŠ” λ°©λ²•μœΌλ‘œ κ·Έ κΈ€μž 값에 점 ꡬ문으둜 이 ν”„λ‘œνΌν‹°λ“€μ˜ 이름을 덧뢙일 수 μžˆλ‹€. (ex. .mm, .ft ...)

이 μ˜ˆμ œμ—μ„œ 1.0 μ΄λΌλŠ” Double 값은 1λ―Έν„°λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ²ƒμœΌλ‘œ κ³ λ €ν•œλ‹€. κ·Έλž˜μ„œ 계산 ν”„λ‘œνΌν‹° m이 self λ₯Ό λ°˜ν™˜ν•˜λŠ” 것이닀. 1.m μ΄λΌλŠ” ν‘œν˜„μ‹μ€ 1.0μ΄λΌλŠ” Double 값을 κ³„μ‚°ν•˜λŠ” 것이닀.

λ‹€λ₯Έ λ‹¨μœ„λ₯Ό λ―Έν„° μΈ‘μ • κ°’μœΌλ‘œ ν‘œν˜„ν•˜λ €λ©΄ μ–΄λ– ν•œ λ³€ν™˜μ΄ ν•„μš”ν•˜λ‹€. 1km λŠ” 1000m μ΄λ―€λ‘œ, km 계산 속성은 1_000.0을 κ³±ν•˜μ—¬ λ―Έν„°λ‘œ ν‘œν˜„ν•œ 수λ₯Ό λ°˜ν™˜ν•œλ‹€. 이와 λΉ„μŠ·ν•˜κ²Œ 1 λ―Έν„°λŠ” 3.28084ν”ΌνŠΈ μ΄λ―€λ‘œ, ft 계산 속성은 μ‹€μ œ Double κ°’ 3.28084둜 λ‚˜λˆ„μ–΄μ„œ ν”ΌνŠΈλ₯Ό λ―Έν„°λ‘œ λ°˜ν™˜ν•œλ‹€. 이 속성듀은 읽기 μ „μš©μ΄λ―€λ‘œ, 간결함을 μœ„ν•΄ get ν‚€μ›Œλ“œ 없이 ν‘œν˜„ν–ˆλ‹€.

let aMarathon = 42.km + 195.m
print("A marathon is \\(aMarathon) meters long")
// "A marathon is 42195.0 meters long" 을 인쇄함

μœ„ μ½”λ“œμ²˜λŸΌ, μ΄λ“€μ˜ λ°˜ν™˜κ°’μ€ Double νƒ€μž… 이며, Double νƒ€μž…μ„ λ°›μ•„λ“€μ΄λŠ” κ³³λ§ˆλ‹€ μˆ˜μ‹ μ•ˆμ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

단, μ΅μŠ€ν…μ…˜μ΄ κΈ°μ‘΄ 속성에 μƒˆλ‘œμš΄ 계산 속성을 μΆ”κ°€ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, μ €μž₯ ν”„λ‘œνΌν‹°λ‚˜ ν”„λ‘œνΌν‹° μ˜΅μ €λ²„λ₯Ό μΆ”κ°€ν•  μˆ˜λŠ” μ—†λ‹€.

 

2. Extension으둜 μƒˆλ‘œμš΄ μƒμ„±μž (Initializers) μΆ”κ°€ν•˜κΈ°

μ΅μŠ€ν…μ…˜μ€ κΈ°μ‘΄ νƒ€μž…μ— μƒˆλ‘œμš΄ μƒμ„±μžλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 νƒ€μž…μ„ ν™•μž₯ν•˜μ—¬ μ»€μŠ€ν…€ νƒ€μž…μ„ μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ‘œ λ°›κ±°λ‚˜, μ›λž˜ μ—†λ˜ μƒμ„±μžλ₯Ό μ œκ³΅ν•  수 μžˆλ‹€. μ΅μŠ€ν…μ…˜μ€ ν΄λž˜μŠ€μ— μƒˆλ‘œμš΄ convenience μƒμ„±μžλ₯Ό μΆ”κ°€ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, designated μƒμ„±μžλ‚˜ μ†Œλ©ΈμžλŠ” μΆ”κ°€ν•  수 μ—†λ‹€. μ΄λŸ¬ν•œ 뢀뢄은 항상 μ‹€μ œ 클래슀 κ΅¬ν˜„λΆ€μ—μ„œ μ •μ˜λ˜μ–΄μ•Ό ν•œλ‹€.

μžμ‹ μ˜ λͺ¨λ“  μ €μž₯ ν”„λ‘œνΌν‹°μ— default값을 μ œκ³΅ν•˜λ©΄μ„œ, μ–΄λ–€ μƒμ„±μžλ„ μ œκ³΅ν•˜μ§€ μ•Šμ€ κ°’ νƒ€μž…μ— μ΅μŠ€ν…μ…˜μœΌλ‘œ μƒμ„±μžλ₯Ό μΆ”κ°€ν•˜λ©΄, μ΅μŠ€ν…μ…˜μ˜ μƒμ„±μž μ•ˆμ—μ„œ κ·Έ κ°’ νƒ€μž…μ˜ default μƒμ„±μžμ™€ memberwise μƒμ„±μžλ₯Ό 호좜 ν•  수 μžˆλ‹€.

λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ„ μ–Έν•œ ꡬ쑰체에 μ΅μŠ€ν…μ…˜μœΌλ‘œ μƒμ„±μžλ₯Ό μΆ”κ°€ν•˜λ©΄, μƒˆλ‘œμš΄ μƒμ„±μžκ°€ μ •μ˜ λͺ¨λ“ˆμ— μžˆλŠ” μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κΈ° μ „κΉŒμ§€λŠ” self에 μ ‘κ·Όν•  수 μ—†λ‹€.

μ•„λž˜ μ˜ˆμ œλŠ” μ‚¬κ°ν˜•μ„ λ‚˜νƒ€λ‚΄λŠ” Rect ꡬ쑰체이닀. Size와 PointλΌλŠ” 두 개의 ꡬ쑰체도 μ •μ˜ν–ˆλ‹€. 두 κ΅¬μ‘°μ²΄λŠ” λ‘˜ λ‹€ λͺ¨λ“  속성에 0.0 μ΄λž€λŠ κΈ°λ³Έ 값을 μ œκ³΅ν•œλ‹€.

struct Size {
  var width = 0.0, height = 0.0
}

struct Point {
  var x = 0.0, y = 0.0
}

struct Rect {
  var origin = Point()
  var size = Size()
}

Rect κ΅¬μ‘°μ²΄λŠ” μžμ‹ μ˜ λͺ¨λ“  속성에 κΈ°λ³Έ 값을 μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ—, μžλ™μœΌλ‘œ default μƒμ„±μžμ™€ memberwise μƒμ„±μžλ₯Ό λ°›λŠ”λ‹€. 이 μƒμ„±μžλ“€μ„ μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ RectμΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€.

let defaultRect = Rect()
let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0))

λ‹€μŒ μ½”λ“œλŠ” Rect ꡬ쑰체λ₯Ό ν™•μž₯ν•˜μ—¬ νŠΉμ •ν•œ 쀑심점과 크기λ₯Ό μ·¨ν•˜λŠ” 좔가적인 μƒμ„±μžλ₯Ό μ •μ˜ν•œ μ½”λ“œμ΄λ‹€.

extension Rect {
  init(center: Point, size: Size) {
    let originX = center.x - (size.width / 2)
    let originY = center.y - (size.height / 2)
    self.init(origin: Point(x: originX, y: originY), size: size)
  }
}

let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))
// centerRect 의 원점은 (2.5, 2.5) 이고, ν¬κΈ°λŠ” (3.0, 3.0) μž„

이 μƒˆλ‘œμš΄ μƒμ„±μžμ˜ μ‹œμž‘μ€ center 및 size 값에 κΈ°μ΄ˆν•˜μ—¬ μ μ ˆν•œ 원점을 κ³„μ‚°ν•˜λŠ” 것이닀. 그런 λ‹€μŒ μƒμ„±μžλŠ” memberwise μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ ν˜ΈμΆœν•΄μ„œ μƒˆλ‘œμš΄ 값을 μ μ ˆν•œ ν”„λ‘œνΌν‹°μ— μ €μž₯ν•œλ‹€.(init) μ΄λ ‡κ²Œ μ΅μŠ€ν…μ…˜μœΌλ‘œ μΆ”κ°€ν•œ μƒμ„±μžλ„ μ΄ˆκΈ°ν™”κ°€ μ™„λ£Œλ˜λ©΄ μΈμŠ€ν„΄μŠ€κ°€ μ™„μ „νžˆ μ΄ˆκΈ°ν™” λ˜λ„λ‘ ν•΄μ•Όν•œλ‹€.

 

3. Extension으둜 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ (Methods), νƒ€μž… λ©”μ„œλ“œ μΆ”κ°€ν•˜κΈ°

μ΅μŠ€ν…μ…˜μ€ κΈ°μ‘΄ νƒ€μž…μ— μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 및 νƒ€μž…λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€. λ‹€μŒ μ˜ˆμ œλŠ” Int νƒ€μž…μ— repetitions μ΄λΌλŠ” μƒˆ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•œ μ½”λ“œμ΄λ‹€.

extension Int {
  func repetitions(task: () -> Void) {
    for _ in 0..<self {
      task()
    }
  }
}

repetition(task: )λ©”μ„œλ“œλŠ” () -> Void νƒ€μž…μ˜ 단일 인자λ₯Ό μ·¨ν•˜λŠ”λ°, μ΄λŠ” λ§€κ°œλ³€μˆ˜λ„ μ—†κ³  값도 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λ₯Ό μ§€μ‹œν•œλ‹€.

이 μ΅μŠ€ν…μ…˜ μ •μ˜ ν›„μ—λŠ” μ–΄λ–€ μ •μˆ˜μ—μ„œλ“  repetition(task: ) λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ κ·Έ 횟수 만큼 μž„λ¬΄λ₯Ό μˆ˜ν–‰ν•  수 μžˆλ‹€.

3.repetitions {
  print("Hello!")
}

// Hello!
// Hello!
// Hello!

3.1 Mutating Instance Methods (λ³€κ²½ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ)

μ΅μŠ€ν…μ…˜μœΌλ‘œ μΆ”κ°€ν•œ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” κ·Έ 자체λ₯Ό μˆ˜μ • λ˜λŠ” λ³€κ²½ (Mutate) ν•  수 μžˆλ‹€. ꡬ쑰체와 μ—΄κ±°ν˜•μ˜ λ©”μ„œλ“œλŠ” κ°’ νƒ€μž…μ΄λ―€λ‘œ 자체적으둜 μˆ˜μ •ν•˜κΈ° μœ„ν•΄μ„œλŠ” mutating ν‚€μ›Œλ“œλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•΄μ„œ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

extension Int {
  mutating func square() {
    self = self * self
  }
}

var someInt = 3
someInt.square()
// someInt λŠ” 이제 9 μž„

 

4. Extension으둜 μƒˆλ‘œμš΄ μ„œλΈŒμŠ€ν¬λ¦½νŠΈ (Subscripts) μΆ”κ°€ν•˜κΈ°

μ΅μŠ€ν…μ…˜μ€ κΈ°μ‘΄ νƒ€μž…μ— μƒˆλ‘œμš΄ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.

λ‹€μŒ μ˜ˆμ œλŠ” μŠ€μœ„ν”„νŠΈ λ‚΄μž₯ Int νƒ€μž…μ— μ •μˆ˜ μ„œλΈŒμŠ€ν¬λ¦½νŠΈλ₯Ό μΆ”κ°€ν•˜λŠ” μ½”λ“œμ΄λ‹€. [n] μ΄λΌλŠ” 이 μ„œλΈŒμŠ€ν¬λ¦½νŠΈλŠ” 수치 κ°’ 였λ₯Έ μͺ½μ—μ„œ n 번째 자리의 10진 숫자λ₯Ό λ°˜ν™˜ν•œλ‹€.

  • 123456789[0] 은 9 λ₯Ό λ°˜ν™˜
  • 123456789[1] 은 8을 λ°˜ν™˜
extension Int {
  subscript**(digitIndex: Int) -> Int {
    var decimalBase = 1
    for _ in 0..<digitIndex {
      decimalBase *= 10
    }
    return (self / decimalBase) % 10
  }
}

746381295[0]
// 5 λ₯Ό λ°˜ν™˜ν•¨
746381295[1]
// 9 λ₯Ό λ°˜ν™˜ν•¨
746381295[2]
// 2 λ₯Ό λ°˜ν™˜ν•¨
746381295[8]
// 7 을 λ°˜ν™˜ν•¨

Int 값에 μš”μ²­ν•œ n 이 λ²”μœ„λ₯Ό λ„˜μ–΄κ°€λ©΄, 0을 λ°˜ν™˜ν•œλ‹€.

746381295[9]
// 마치 μ΄λ ‡κ²Œ μš”μ²­ν•œ κ²ƒμ²˜λŸΌ, 0 을 λ°˜ν™˜ν•¨:
0746381295[9]

 

5. Extension으둜 κΈ°μ‘΄ 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ— 쀑첩 νƒ€μž… (Nested Type) μΆ”κ°€ν•˜κΈ°

μ΅μŠ€ν…μ…˜μ€ 기쑴의 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ— μƒˆλ‘œμš΄ 쀑첩 νƒ€μž…μ„ μΆ”κ°€ν•  수 μžˆλ‹€.

extension Int {
  enum Kind {
    case negative, zero, positive
  }

  var kind: Kind {
    switch self {
    case 0:
      return .zero
    case let x where x > 0:
      return .positive
    default:
      return .negative
    }
  }
}

이 μ½”λ“œλŠ” Int에 μƒˆλ‘œμš΄ 쀑첩 μ—΄κ±°ν˜•μ„ μΆ”κ°€ν•œλ‹€. KindλΌλŠ” 이 μ—΄κ±°ν˜•μ€ ν•œ νŠΉλ³„ν•œ μ •μˆ˜κ°€ λ‚˜νƒ€λ‚΄λŠ” 수치 κ°’μ˜ μ’…λ₯˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 수치 값이 μŒμˆ˜μΈμ§€, 0, μ–‘μˆ˜μΈμ§€λ₯Ό ν‘œν˜„ν•΄μ€€λ‹€.

λ‘λ²ˆμ§Έ λ‹¨λ½μ—μ„œ, κ·Έ μ •μˆ˜μ— λŒ€ν•œ μ μ ˆν•œ Kind μ—΄κ±°ν˜•μ„ λ°˜ν™˜ν•˜λŠ”, kind(μ†Œλ¬Έμž) λΌλŠ” μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€ 속성도 Int에 μΆ”κ°€ν•΄μ£Όμ—ˆλ‹€.

func printIntegerKinds(_ number: [Int]) {
  for number in numbers {
    switch number.kind {
    case .negative:
      print("- ", terminator: "")
    case .zero:
      print("0 ", terminator: "")
    case .positive:
      print("+ ", terminator: "")
    }
  }
  print("")
}

printIntegerKinds([3, 19, -27, 0, -6, 0, 7])
// "+ + - 0 - 0 + " λ₯Ό 인쇄함

μœ„μ—μ„œ μΆ”κ°€ν•œ Kind μ—΄κ±°ν˜•μ„ μ‚¬μš©ν•˜μ—¬ printIntegerKinds(_: ) λ©”μ„œλ“œλ₯Ό μ •μ˜ν–ˆλ‹€. 이 ν•¨μˆ˜λŠ” μ–΄λ– ν•œ μ •μˆ˜μ— λŒ€ν•˜μ—¬ 음수면 -, μ–‘μˆ˜λ©΄ +, 0이면 0을 좜λ ₯ν•œλ‹€.

λ°˜μ‘ν˜•