Swift/Swift Documents

[Swift] 곡식 λ¬Έμ„œ 정리 (20) - Nested Types (쀑첩 νƒ€μž…)

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

μ•ˆλ…•ν•˜μ„Έμš”, κ°μžμž…λ‹ˆλ‹€. μ˜€λŠ˜μ€ κ³΅μ‹λ¬Έμ„œ 20번째 챕터 쀑첩 νƒ€μž…μ— λŒ€ν•΄μ„œ κ³΅λΆ€ν•œ 글을 정리해보렀고 ν•©λ‹ˆλ‹€. 아직 μ•±κ°œλ°œμ„ 막 ν•΄λ³Έ κ²½ν—˜μ΄ μ—†μ–΄μ„œ ν•΄λ‹Ή μ€‘μ²©νƒ€μž…μ— λŒ€ν•΄μ„œλ„ μ•½κ°„ 애맀λͺ¨ν˜Έν•˜κ²Œ 이해가 λ˜λŠ” 감이 없지 μ•Šμ•„ μžˆλ„€μš”.  μ°¨μ°¨ 잘 μ•Œκ²Œ 되겟죠? γ…Žγ…Ž 일단 기초 λΉ‘μ„Έκ²Œ μž‘μ•„λ΄…μ‹œλ‹€. 

Swift Document chap.20 Nested Types λ°”λ‘œκ°€κΈ°

 

Nested Types — The Swift Programming Language (Swift 5.6)

Nested Types Enumerations are often created to support a specific class or structure’s functionality. Similarly, it can be convenient to define utility classes and structures purely for use within the context of a more complex type. To accomplish this, S

docs.swift.org


 

Nested Types (쀑첩 νƒ€μž…)

μ—΄κ±°ν˜•μ€ 가끔 νŠΉμ • ν΄λž˜μŠ€μ™€ ꡬ쑰체의 κΈ°λŠ₯을 μ§€μ›ν•˜κΈ° μœ„ν•΄ μƒμ„±λœλ‹€. 이와 λΉ„μŠ·ν•˜κ²Œ λ³΅μž‘ν•œ νƒ€μž…μ˜ ν΄λž˜μŠ€μ™€ ꡬ쑰체λ₯Ό μ‚¬μš©ν•  λ•Œ, κ·Έ μ•ˆμ—μ„œ λͺ¨λ“  것을 κ΅¬ν˜„ν•˜λŠ” 것이 νŽΈλ¦¬ν•  수 μžˆλ‹€. 즉 ν•΄λ‹Ή 블둝 μ•ˆμ— 또 λ‹€λ₯Έ μ—΄κ±°ν˜•, 클래슀, ꡬ쑰체λ₯Ό μ€‘μ²©ν•΄μ„œ μ •μ˜ν•  수 μžˆλ‹€λŠ” 말이닀. λ‹€λ₯Έ νƒ€μž… 내에 νƒ€μž…μ„ μ€‘μ²©ν•˜λ €λ©΄ μ§€μ›ν•˜λŠ” νƒ€μž…μ˜ μ™ΈλΆ€ μ€‘κ΄„ν˜Έ μ•ˆμ— μ •μ˜λ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€.


 

Nested Types의 μ‚¬μš© 예제

μ•„λž˜ μ˜ˆμ œλŠ” λΈ”λž™μž­ κ²Œμž„μ„ ꡬ쑰체둜 μ •μ˜ν•œ μ½”λ“œμ΄λ‹€. BlackjackCard κ΅¬μ‘°μ²΄λŠ” suit와 RankλΌλŠ” 두 개의 쀑첩 μ—΄κ±°ν˜• νƒ€μž…μ„ κ°–λŠ”λ‹€.

struct BlackjackCard {

  // 쀑첩 Suit 열거체
  enum Suit: Character {
    case spades = "♠", hearts = "β™‘", diamonds = "β™’", clubs = "♣"
  }

  // 쀑첩 Rank 열거체
  enum Rank: Int {
    case two = 2, three, four, five, six, seven, eight, nine, ten
    case jack, queen, king, ace

    struct Values {
      let first: Int, second: Int?
    }
    var values: Values {
      switch self {
      case .ace:
        return Values(first: 1, second: 11)
      case .jack, .queen, .king:
        return Values(first: 10, second: nil)
      default:
        return Values(first: self.rawValue, second: nil)
      }
    }
  }

  // BlackjackCard 의 속성 및 λ©”μ†Œλ“œ
  let rank: Rank, suit: Suit
  var description: String {
    var output = "suit is \\(suit.rawValue),"
    output += " value is \\(rank.values.first)"
    if let second = rank.values.second {
      output += " or \\(second)"
    }
    return output
  }
}
  • Suit μ—΄κ±°ν˜• = μžμ‹ μ˜ 기호λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Character μ›μ‹œκ°’κ³Ό 일반 κ²Œμž„μš© μΉ΄λ“œμ˜ λ„€ 가지 패λ₯Ό ν•¨κ»˜ μ„€λͺ…ν•œλ‹€.
  • Rank μ—΄κ±°ν˜•
    • μΉ΄λ“œμ˜ μˆ«μžκ°’μ„ λ‚˜νƒ€λ‚΄λŠ” 값이닀.
    • Rank μ—΄κ±°ν˜• μ•ˆμ—λŠ” Values ꡬ쑰체가 또 λ‹€λ₯Έ 쀑첩 νƒ€μž…μœΌλ‘œ μ •μ˜λ˜μ–΄ μžˆλ‹€.
      • 예λ₯Ό λ“€μ–΄ ace μΉ΄λ“œλŠ” 1,11 둜 μ‚¬μš©λ  수 μžˆλŠ”λ°, 이λ₯Ό ν‘œν˜„ν•œ ꡬ쑰체이닀.
      • 즉, λŒ€λΆ€λΆ„μ˜ μΉ΄λ“œ 값은 ν•˜λ‚˜μ΄μ§€λ§Œ, ace μΉ΄λ“œμ˜ κ°’μ—λŠ” 두 개의 값이 μžˆλ‹€λŠ” 사싀을 μ€λ‹‰ν•˜κ³  μžˆλ‹€λŠ” 것을 λ‚˜νƒ€λ‚Έλ‹€.
      • Values κ΅¬μ‘°μ²΄λŠ” 두 개의 속성을 μ •μ˜ν•˜μ—¬ 이λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. (first νƒ€μž…μ€ Int, second νƒ€μž…μ€ Int?)
    • Values ꡬ쑰체 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” values λΌλŠ” 계산 ν”„λ‘œνΌν‹°λ„ μ •μ˜ν•˜κ³  μžˆλ‹€.
      • μΉ΄λ“œ 값을 μ μ ˆν•œ κ°’μœΌλ‘œ μƒˆλ‘œμš΄ Values μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™” ν•œλ‹€. (jack, queen, ace, king 이면 νŠΉμˆ˜ν•œ 값을 μ‚¬μš©ν•˜κ³ , μˆ«μžμΉ΄λ“œλ©΄ Int μ›μ‹œκ°’μ„ μ‚¬μš©ν•œλ‹€.

BlackjackCard ꡬ쑰체 κ·Έ μžμ²΄λŠ” rank 와 suit 두 속성을 가진닀. description μ΄λΌλŠ” 속성도 μ •μ˜ν•˜λŠ”λ°, μ΄λŠ” rank 와 suit에 μ €μž₯ν•œ 값을 μ‚¬μš©ν•˜μ—¬ μΉ΄λ“œμ˜ 이름과 κ°’μ˜ μ„€λͺ…을 좜λ ₯ν•œλ‹€. description의 속성은 μ˜΅μ…”λ„ 체이닝을 μ‚¬μš©ν•˜μ—¬ 보여쀄 second 값이 μžˆλŠ”μ§€ κ²€μ‚¬ν•˜κ³ , 그럴 경우 second 값에 λŒ€ν•œ 좔가적인 μ„€λͺ…도 좜λ ₯ν•œλ‹€. (aceκ°€ second 값을 가진닀.)

  • ace μΉ΄λ“œλ₯Ό 예둜 λ“€μ–΄λ³΄μž. BlackjackCard의 ν”„λ‘œνΌν‹°μΈ descriptionμ—μ„œ λ§Œμ•½ Rank κ°€ ace라면 Rank의 Values ꡬ쑰체에 first, second 값에 1, 11이 ν• λ‹Ήλœλ‹€. 이λ₯Ό μ‚¬μš©ν•˜μ—¬ descriptionν”„λ‘œνΌν‹°λ₯Ό κ΅¬μ„±ν•˜κ²Œ λ˜λŠ”λ° second 값은 μ˜΅μ…”λ„ νƒ€μž…μ΄λ―€λ‘œ μ—†μœΌλ©΄ μ²˜λ¦¬λ˜μ§€ μ•ŠλŠ”λ‹€. aceλŠ” 가지고 있기 λ•Œλ¬Έμ— μ²˜λ¦¬λ˜μ–΄ κ²°κ³Όκ°€ λ‚˜μ˜€κ²Œ λœλ‹€.
let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
print("theAceOfSpades: \\(theAceOfSpades.description)")
// "theAceOfSpades: suit is ♠, value is 1 or 11" λ₯Ό 인쇄함

BlackjackCardλŠ” μžμ‹ λ§Œμ˜ μƒμ„œμžκ°€ μ—†λŠ” ꡬ쑰체이기 λ•Œλ¬Έμ—, μ•”μ‹œμ μΈ memberwise μƒμ„±μžλ₯Ό κ°–λŠ”λ‹€. (chap.14 initialization μ°Έκ³ ) 이 μƒμ„±μžλ₯Ό μ‚¬μš©ν•΄μ„œ theAceOfSpades λΌλŠ” μƒˆλ‘œμš΄ μƒμˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•  수 μžˆλ‹€.

Rank와 Suitκ°€ BlackjackCardμ•ˆμ— μ€‘μ²©λ˜μ–΄ μžˆμ„ 지라도, 이 νƒ€μž…λ“€μ€ 좔둠이 κ°€λŠ₯ν•΄μ„œ .ace, .spades λΌλŠ” μžμ‹ μ˜ case 이름 λ§ŒμœΌλ‘œλ„ 이 μΈμŠ€ν„΄μŠ€μ˜ μƒμ„±μžκ°€ μ—΄κ±°ν˜• caseλ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. μœ„ μ˜ˆμ œμ—μ„œλŠ” μŠ€νŽ˜μ΄λ“œ μ—μ΄μŠ€μ—” 1 Or 11 의 값이 μžˆμŒμ„ description속성이 μ˜¬λ°”λ₯΄κ²Œ λ³΄κ³ ν•œλ‹€.

 


 

쀑첩 νƒ€μž… μ°Έμ‘°ν•˜κΈ°

μžμ‹ μ„ μ •μ˜ν•œ κ³³ λ°–μ—μ„œ μ€‘μ²©νƒ€μž…μ„ μ‚¬μš©ν•˜λ €λ©΄, κ·Έ 이름에 μžμ‹ μ„ μ€‘μ²©ν•œ νƒ€μž…μ˜ 이름을 μ ‘λ‘μ‚¬λ‘œ 뢙인닀.

let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
// heartsSymbol 은 "β™‘" μž„

μœ„ μ˜ˆμ œμ—μ„œ, μ΄λŠ” Suit, Rank, 및 Values μ˜ 이름을 μ˜λ„μ μœΌλ‘œ 짧게 μœ μ§€ν•  수 있게 ν•˜λŠ”λ°, μžμ‹ μ„ μ •μ˜ν•œ 곳이 μžμ‹ μ˜ 이름을 μžμ—°μŠ€λŸ½κ²Œ 규λͺ…ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ°˜μ‘ν˜•