μλ νμΈμ. μ€λμ Swiftμ 'μ€μ²© νμ (Nested Types)'μ λν΄ μμλ³΄κ² μ΅λλ€. μ€μ²© νμ μ ν¨κ³Όμ μΌλ‘ νμ©νλ©΄ μ½λμ ꡬ쑰μ κ°λ μ±μ ν₯μμν¬ μ μμ΅λλ€.
π μ€μ²© νμ μ΄λ?
μ€μ²© νμ (Nested Types)μ λ€λ₯Έ νμ (ν΄λμ€, ꡬ쑰체, μ΄κ±°ν) λ΄λΆμ μ μλ νμ μ λ§ν©λλ€. μ΄λ νΉμ νμ κ³Ό λ°μ νκ² μ°κ΄λ 보쑰 νμ μ λ Όλ¦¬μ μΌλ‘ κ·Έλ£Ήννλ λ° μ μ©ν©λλ€.
struct OuterType {
// μ€μ²©λ μ΄κ±°ν
enum NestedEnum {
// μ΄κ±°ν λ΄μ©
}
// μ€μ²©λ ꡬ쑰체
struct NestedStruct {
// ꡬ쑰체 λ΄μ©
}
// μ€μ²©λ ν΄λμ€
class NestedClass {
// ν΄λμ€ λ΄μ©
}
}
μ€μ²© νμ μ μ₯μ : κ΄λ ¨ νμ μ λ Όλ¦¬μ μΌλ‘ κ·Έλ£Ήννκ³ , λ€μμ€νμ΄μ€λ₯Ό μ 곡νλ©°, μ½λμ λ²μμ κ°μμ±μ λͺ ννκ² ν©λλ€.
π μ€μ²© νμ μ μ¬μ©νλ μ΄μ
- κ΄λ ¨μ±: νΉμ νμ λ§μ μν 보쑰 νμ μ λͺ νν ννν μ μμ΅λλ€.
- λ€μμ€νμ΄μ€: μ΄λ¦ μΆ©λμ λ°©μ§νκ³ μ½λ ꡬ쑰λ₯Ό λ λͺ ννκ² ν©λλ€.
- μΊ‘μν: μΈλΆμμ μ κ·Όν νμκ° μλ νμ μ μ¨κΈΈ μ μμ΅λλ€.
- μ½λ ꡬμ±: κ΄λ ¨ κΈ°λ₯μ λ Όλ¦¬μ μΌλ‘ κ·Έλ£Ήννμ¬ μ½λλ₯Ό λ μ½κ² μ΄ν΄ν μ μμ΅λλ€.
π μ€μ²© νμ μ μ€μ μμ : λΈλμ μΉ΄λ
λ€μ μμ λ λΈλμ κ²μμ μΉ΄λλ₯Ό λͺ¨λΈλ§νλ 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
// Rank λ΄μ μ€μ²©λ Values ꡬ쑰체
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 μ΄κ±°ν: μΉ΄λμ μ«μ(2~10, J, Q, K, A)λ₯Ό μ μν©λλ€.
- Int νμ μ μμκ°μ μ¬μ©νμ¬ μ«μ μΉ΄λμ κ°μ μ μ₯ν©λλ€.
- Values ꡬ쑰체: Rank λ΄μ μ€μ²©λ ꡬ쑰체λ‘, μΉ΄λμ μ μ κ°μ μ μ₯ν©λλ€.
- first: κΈ°λ³Έ μ μ κ°
- second: λ체 μ μ κ°(μμ΄μ€ μΉ΄λμ κ²½μ° 1 λλ 11)
μ΄λ° ꡬ쑰λ μΉ΄λμ λ Όλ¦¬μ ꡬμ±μ μ½λ ꡬ쑰μ κ·Έλλ‘ λ°μν©λλ€. λν Suitμ RankλΌλ μΌλ°μ μΈ μ΄λ¦μ μ¬μ©νλ©΄μλ λ€λ₯Έ μ½λμμ μ΄λ¦ μΆ©λμ λ°©μ§ν μ μμ΅λλ€.
π μ€μ²©λ νμ μ¬μ©νκΈ°
BlackjackCard ꡬ쑰체μ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μ¬μ©νλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€:
let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
print("theAceOfSpades: \(theAceOfSpades.description)")
// μΆλ ₯: "theAceOfSpades: suit is ♠, value is 1 or 11"
μ¬κΈ°μ μ£Όλͺ©ν μ μ μ΄κΈ°ν μ .aceμ .spadesμ κ°μ΄ μ΄κ±°ν μΌμ΄μ€ μ΄λ¦λ§μΌλ‘ κ°μ μ°Έμ‘°ν μ μλ€λ κ²μ λλ€. μ΄λ Swiftκ° νμ μ 컨ν μ€νΈμμ μΆλ‘ ν μ μκΈ° λλ¬Έμ λλ€.
π μΈλΆμμ μ€μ²© νμ μ°Έμ‘°νκΈ°
μ€μ²© νμ μ μ μν νμ μΈλΆμμ μ°Έμ‘°ν΄μΌ ν κ²½μ°, μ 체 κ²½λ‘λ₯Ό μ§μ ν΄μΌ ν©λλ€:
let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
// heartsSymbolμ "β‘"
μ΄λ κ² μ νκΈ°λ²(dot notation)μ μ¬μ©νμ¬ μ€μ²© νμ μ μ 체 κ²½λ‘λ₯Ό λͺ μν©λλ€. μ΄λ Javaλ C#μ λ€μμ€νμ΄μ€ κ°λ κ³Ό μ μ¬ν©λλ€.
π μ€μ²© νμ νμ© μ λ΅
μ€μ²© νμ μ ν¨κ³Όμ μΌλ‘ νμ©νκΈ° μν λͺ κ°μ§ μ λ΅μ μκ°ν©λλ€:
1. κ΄λ ¨ μμ κ·Έλ£Ήν
νΉμ νμ κ³Ό κ΄λ ¨λ μμλ₯Ό μ€μ²© μ΄κ±°νμΌλ‘ κ·Έλ£Ήνν μ μμ΅λλ€:
struct NetworkManager {
enum HTTPMethod: String {
case get = "GET"
case post = "POST"
case put = "PUT"
case delete = "DELETE"
}
func request(url: URL, method: HTTPMethod) {
// ꡬν λ΄μ©
}
}
2. νΉμ νμ μμλ§ μ¬μ©νλ μ€λ₯ νμ μ μ
class DataManager {
enum DataError: Error {
case fileNotFound
case corruptData
case insufficientPermissions
}
func loadData() throws {
throw DataError.fileNotFound
}
}
3. μ¬λ¬ μμ€μ μ€μ²© νμ©
νμμ λ°λΌ μ¬λ¬ μμ€μ μ€μ²©μ μ¬μ©ν μ μμ΅λλ€:
struct AppConfiguration {
struct UI {
struct Colors {
static let primary = "#FF5733"
static let secondary = "#33FF57"
}
struct Fonts {
static let title = "Helvetica-Bold"
static let body = "Helvetica"
}
}
struct API {
static let baseURL = "https://api.example.com"
static let timeout = 30.0
}
}
// μ¬μ© μ
let primaryColor = AppConfiguration.UI.Colors.primary
π μ€μ²© νμ μ μ¬μ©ν λ μ£Όμμ¬ν
- κ³Όλν μ€μ²© νΌνκΈ°: λ무 κΉμ μ€μ²©μ μ½λ κ°λ μ±μ λ¨μ΄λ¨λ¦΄ μ μμ΅λλ€.
- μ κ·Ό μ μ΄ κ³ λ €νκΈ°: μ€μ²© νμ λ private, internal, public λ±μ μ κ·Ό μ μ΄μλ₯Ό μ¬μ©ν μ μμ΅λλ€.
- νμ₯μ± κ³ λ €: λμ€μ νμ κ΄κ³κ° λ³κ²½λ κ°λ₯μ±μ΄ μλ€λ©΄ μ€μ²©λ³΄λ€λ λ³λμ νμ μΌλ‘ μ μνλ κ²μ΄ μ’μ μ μμ΅λλ€.
π Swift νμ€ λΌμ΄λΈλ¬λ¦¬μ μ€μ²© νμ μμ
Swift νμ€ λΌμ΄λΈλ¬λ¦¬μμλ μ€μ²© νμ μ ν¨κ³Όμ μΌλ‘ νμ©νκ³ μμ΅λλ€:
// Arrayμ μ€μ²© νμ
μμ
let iterator: Array<Int>.Iterator
let index: Array<Int>.Index
// Stringμ μ€μ²© νμ
μμ
let stringIndex: String.Index
π μ 리
μ€μ²© νμ μ Swiftμμ μ½λλ₯Ό λ Όλ¦¬μ μΌλ‘ ꡬμ±νκ³ κ΄λ ¨ κΈ°λ₯μ κ·Έλ£Ήννλ λꡬμ λλ€. νΉν νΉμ νμ μμλ§ μ¬μ©λλ 보쑰 νμ μ μ μν λ μ μ©νλ©°, μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ ν₯μμν΅λλ€.
λΈλμ μΉ΄λ μμ μμ 보μλ―μ΄, μ€μ²© νμ μ μ¬μ©νλ©΄ μ½λμ κ΅¬μ‘°κ° μ€μ κ°λ μ λͺ¨λΈμ λ μ λ°μν μ μμ΅λλ€. μ΄λ μ½λλ₯Ό μ½κ³ μ΄ν΄νκΈ° μ½κ² λ§λ€λ©°, λ μ§κ΄μ μΈ APIλ₯Ό μ€κ³νλ λ° λμμ΄ λ©λλ€.
'π₯ Bread Basics > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Swift 곡μ λ¬Έμ μ 리 - λΆν¬λͺ ν νμ (Opaque Types) (0) | 2025.04.13 |
---|---|
Swift 곡μ λ¬Έμ μ 리 - μ λλ¦ (Generics) (0) | 2025.04.13 |
Swift 곡μ λ¬Έμ μ 리 - νλ‘ν μ½ (Protocols) (0) | 2025.04.13 |
Swift 곡μ λ¬Έμ μ 리 - νμ₯ (Extensions) (0) | 2025.04.13 |
Swift 곡μ λ¬Έμ μ 리 - νμ μΊμ€ν (Type Casting) (0) | 2025.04.12 |
Obj-C 곡μ λ¬Έμ μ 리 - κ°μ²΄, ν΄λμ€, λ©μμ§ (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - λ§€ν¬λ‘ (Macros) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - λμμ± (Concurrency) (0) | 2025.04.11 |