[Swift] 곡μ λ¬Έμ μ 리 (20) - Nested Types (μ€μ²© νμ )
μλ νμΈμ, κ°μμ λλ€. μ€λμ 곡μλ¬Έμ 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 μ μ΄λ¦μ μλμ μΌλ‘ μ§§κ² μ μ§ν μ μκ² νλλ°, μμ μ μ μν κ³³μ΄ μμ μ μ΄λ¦μ μμ°μ€λ½κ² κ·λͺ νκΈ° λλ¬Έμ΄λ€.