Thanks to visit codestin.com
Credit goes to github.com

Skip to content

KSK9820/DoraKit

Repository files navigation

DoraKit

Swift Platform License

DoraKit은 Swift의 Codable ν”„λ‘œν† μ½œμ„ μœ„ν•œ μžλ™ν™”λœ JSON μ½”λ”© ν‚€ 생성을 μ œκ³΅ν•˜λŠ” Swift 맀크둜 λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. λ³΅μž‘ν•œ CodingKeys enum을 μˆ˜λ™μœΌλ‘œ μž‘μ„±ν•  ν•„μš” 없이, κ°„λ‹¨ν•œ 맀크둜λ₯Ό μ‚¬μš©ν•˜μ—¬ JSON 직렬화/역직렬화λ₯Ό μžλ™ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

✨ μ£Όμš” κΈ°λŠ₯

  • μžλ™ CodingKeys 생성: @AutoCodingKeys 맀크둜둜 μžλ™ CodingKeys enum 생성
  • μ»€μŠ€ν…€ JSON ν‚€ λ§€ν•‘: @jsonKey 맀크둜둜 Swift ν”„λ‘œνΌν‹°λͺ…κ³Ό JSON ν‚€λͺ… 뢄리
  • μžλ™ ν”„λ‘œν† μ½œ μ€€μˆ˜: λˆ„λ½λœ Codable, Encodable, Decodable ν”„λ‘œν† μ½œ μžλ™ μΆ”κ°€
  • νƒ€μž… μ•ˆμ „μ„±: 컴파일 νƒ€μž„μ— JSON ν‚€ 쀑볡 및 μœ νš¨μ„± 검사
  • 계산 ν”„λ‘œνΌν‹° λ¬΄μ‹œ: μ €μž₯ ν”„λ‘œνΌν‹°λ§Œ μžλ™μœΌλ‘œ 처리

πŸš€ λΉ λ₯Έ μ‹œμž‘

μ„€μΉ˜

Swift Package Managerλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„€μΉ˜ν•˜μ„Έμš”:

dependencies: [
    .package(url: "https://github.com/KSK9820/DoraKit.git", from: "1.0.0")
]

κΈ°λ³Έ μ‚¬μš©λ²•

import DoraKit

@AutoCodingKeys
struct User {
    @JsonKey("user_name") let name: String
    @JsonKey("user_age") let age: Int
    let email: String        // "email"둜 λ§€ν•‘
    let isActive: Bool       // "isActive"둜 λ§€ν•‘
    
    var fullName: String {   // 계산 ν”„λ‘œνΌν‹°λŠ” λ¬΄μ‹œλ¨
        "\(name) (\(age))"
    }
}

μœ„ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 μžλ™μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€:

struct User {
    let name: String
    let age: Int
    let email: String
    let isActive: Bool
    
    enum CodingKeys: String, CodingKey {
        case name = "user_name"
        case age = "user_age"
        case email
        case isActive
    }
}

extension User: Codable {
}

πŸ“– 상세 μ‚¬μš©λ²•

@JsonKey 맀크둜

κ°œλ³„ ν”„λ‘œνΌν‹°μ— μ»€μŠ€ν…€ JSON ν‚€λ₯Ό μ§€μ •ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

struct Product {
    @JsonKey("product_id") let id: String
    @JsonKey("product_name") let name: String
    let price: Double  // "price"둜 λ§€ν•‘
}

μ œμ•½μ‚¬ν•­:

  • let λ˜λŠ” var μ„ μ–Έμ—λ§Œ μ‚¬μš© κ°€λŠ₯
  • λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄λ§Œ 인자둜 ν—ˆμš©
  • 빈 λ¬Έμžμ—΄μ€ ν—ˆμš©ν•˜μ§€ μ•ŠμŒ
  • ν•˜λ‚˜μ˜ ν”„λ‘œνΌν‹°μ— ν•˜λ‚˜μ˜ @JsonKey만 μ‚¬μš© κ°€λŠ₯

@AutoCodingKeys 맀크둜

κ΅¬μ‘°μ²΄λ‚˜ ν΄λž˜μŠ€μ— μžλ™ CodingKeys 생성을 μ μš©ν•©λ‹ˆλ‹€.

@AutoCodingKeys
struct Settings {
    let theme: String
    let notifications: Bool
    @JsonKey("dark_mode") let isDarkMode: Bool
}

μƒμ„±λ˜λŠ” μ½”λ“œ:

struct Settings {
    let theme: String
    let notifications: Bool
    let isDarkMode: Bool
    
    enum CodingKeys: String, CodingKey {
        case theme
        case notifications
        case isDarkMode = "dark_mode"
    }
}

extension Settings: Codable {
}

ν”„λ‘œν† μ½œ μ€€μˆ˜ μžλ™ν™”

λ§€ν¬λ‘œλŠ” λˆ„λ½λœ Codable κ΄€λ ¨ ν”„λ‘œν† μ½œμ„ μžλ™μœΌλ‘œ μΆ”κ°€ν•©λ‹ˆλ‹€:

// κΈ°μ‘΄: Codable μ—†μŒ β†’ Codable μΆ”κ°€
@AutoCodingKeys
struct User {
    let name: String
}

// κΈ°μ‘΄: Encodable만 있음 β†’ Decodable μΆ”κ°€
@AutoCodingKeys
struct Product: Encodable {
    let id: String
}

// κΈ°μ‘΄: Decodable만 있음 β†’ Encodable μΆ”κ°€
@AutoCodingKeys
struct Config: Decodable {
    let setting: String
}

// κΈ°μ‘΄: Codable 있음 β†’ λ³€κ²½ μ—†μŒ
@AutoCodingKeys
struct Data: Codable {
    let value: String
}

⚠️ μ œμ•½μ‚¬ν•­ 및 μ£Όμ˜μ‚¬ν•­

@JsonKey 맀크둜

  • λ³€μˆ˜ μ„ μ–Έμ—λ§Œ μ‚¬μš©: ν•¨μˆ˜, 클래슀, ꡬ쑰체 μ„ μ–Έμ—λŠ” μ‚¬μš© λΆˆκ°€
  • λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄λ§Œ ν—ˆμš©: λ³€μˆ˜λ‚˜ ν‘œν˜„μ‹μ€ 인자둜 μ‚¬μš© λΆˆκ°€
  • 빈 λ¬Έμžμ—΄ κΈˆμ§€: @JsonKey("")λŠ” ν—ˆμš©λ˜μ§€ μ•ŠμŒ
  • 쀑볡 μ‚¬μš© κΈˆμ§€: ν•˜λ‚˜μ˜ ν”„λ‘œνΌν‹°μ— μ—¬λŸ¬ @JsonKey μ‚¬μš© λΆˆκ°€

@AutoCodingKeys 맀크둜

  • ꡬ쑰체/ν΄λž˜μŠ€μ—λ§Œ μ‚¬μš©: ν•¨μˆ˜λ‚˜ λ‹€λ₯Έ μ„ μ–Έμ—λŠ” μ‚¬μš© λΆˆκ°€
  • κΈ°μ‘΄ CodingKeys와 좩돌: 이미 CodingKeys enumμ΄λ‚˜ typealiasκ°€ 있으면 μ‚¬μš© λΆˆκ°€
  • μ €μž₯ ν”„λ‘œνΌν‹°λ§Œ 처리: 계산 ν”„λ‘œνΌν‹°λŠ” μžλ™μœΌλ‘œ λ¬΄μ‹œλ¨
  • μ΅œμ†Œ ν•˜λ‚˜μ˜ μ €μž₯ ν”„λ‘œνΌν‹° ν•„μš”: μ €μž₯ ν”„λ‘œνΌν‹°κ°€ μ—†μœΌλ©΄ μ—λŸ¬ λ°œμƒ
  • κ³ μœ ν•œ JSON ν‚€ ν•„μš”: λͺ¨λ“  JSON ν‚€λŠ” νƒ€μž… λ‚΄μ—μ„œ κ³ μœ ν•΄μ•Ό 함

πŸ§ͺ 예제

기본 예제

import DoraKit

@AutoCodingKeys
struct User {
    @JsonKey("user_name") let name: String
    let age: Int
}

@AutoCodingKeys
struct Product: Codable {
    @JsonKey("product_id") let id: String
    @JsonKey("product_name") let name: String
}

@AutoCodingKeys
struct Settings: Encodable, Hashable {
    @JsonKey("dark_mode") let isDarkMode: Bool
    let theme: String
}

λ³΅μž‘ν•œ 예제

@AutoCodingKeys
struct APIResponse<T: Codable> {
    @JsonKey("status_code") let statusCode: Int
    @JsonKey("error_message") let errorMessage: String?
    let data: T
    let timestamp: Date
    let success: Bool
    
    // 계산 ν”„λ‘œνΌν‹°λŠ” λ¬΄μ‹œλ¨
    var formattedTimestamp: String {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        return formatter.string(from: timestamp)
    }
}

πŸ”§ 개발 ν™˜κ²½

μš”κ΅¬μ‚¬ν•­

  • Swift 6.0+
  • macOS 10.15+, iOS 13+, tvOS 13+, watchOS 6+, macCatalyst 13+

μ˜μ‘΄μ„±

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

DoraKit/
β”œβ”€β”€ Sources/
β”‚   β”œβ”€β”€ DoraKit/              # 곡개 API
β”‚   β”‚   └── DoraKit.swift     # 맀크둜 μ„ μ–Έ
β”‚   β”œβ”€β”€ DoraKitMacros/        # 맀크둜 κ΅¬ν˜„
β”‚   β”‚   β”œβ”€β”€ JsonKeyMacro.swift          # @jsonKey 맀크둜 κ΅¬ν˜„
β”‚   β”‚   β”œβ”€β”€ AutoCodingKeysMacro.swift   # @AutoCodingKeys 맀크둜 κ΅¬ν˜„
β”‚   β”‚   β”œβ”€β”€ MacroExpansionError.swift   # μ—λŸ¬ νƒ€μž… μ •μ˜
β”‚   β”‚   └── DoraKitPlugin.swift         # 컴파일러 ν”ŒλŸ¬κ·ΈμΈ 등둝
β”‚   └── DoraKitClient/        # μ‚¬μš© 예제
β”‚       └── main.swift
β”œβ”€β”€ Tests/
β”‚   └── DoraKitTests/         # ν…ŒμŠ€νŠΈ μ½”λ“œ
β”‚       └── DoraKitTests.swift
└── Package.swift

πŸ§ͺ ν…ŒμŠ€νŠΈ

ν”„λ‘œμ νŠΈλŠ” 포괄적인 ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€:

swift test

ν…ŒμŠ€νŠΈλŠ” λ‹€μŒμ„ ν¬ν•¨ν•©λ‹ˆλ‹€:

  • @jsonKey 맀크둜의 λ‹€μ–‘ν•œ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€
  • @AutoCodingKeys 맀크둜의 ν”„λ‘œν† μ½œ μ€€μˆ˜ μžλ™ν™”
  • μ—λŸ¬ μΌ€μ΄μŠ€ 및 μ œμ•½μ‚¬ν•­ 검증
  • λ³΅μž‘ν•œ κ΅¬μ‘°μ²΄μ—μ„œμ˜ λ™μž‘ 확인

🀝 κΈ°μ—¬ν•˜κΈ°

기여에 관심을 κ°€μ Έμ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! μžμ„Έν•œ κΈ°μ—¬ κ°€μ΄λ“œλŠ” CONTRIBUTING.mdλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

개발 ν™˜κ²½ μ„€μ •

μš”κ΅¬μ‚¬ν•­:

  • Swift 6.0+
  • Xcode 15.0+ (개발용)
  • macOS 10.15+

λΉŒλ“œ 및 ν…ŒμŠ€νŠΈ:

# μ €μž₯μ†Œ 클둠
git clone https://github.com/KSK9820/DoraKit.git
cd DoraKit

# ν”„λ‘œμ νŠΈ λΉŒλ“œ
swift build

# ν…ŒμŠ€νŠΈ μ‹€ν–‰
swift test

κ°„λ‹¨ν•œ κΈ°μ—¬ κ³Όμ •

  1. μ €μž₯μ†Œλ₯Ό ν¬ν¬ν•˜μ„Έμš”
  2. κΈ°λŠ₯ 브랜치λ₯Ό μƒμ„±ν•˜μ„Έμš” (git checkout -b feature/amazing-feature)
  3. 변경사항을 μ»€λ°‹ν•˜μ„Έμš” (git commit -m 'Add some amazing feature')
  4. λΈŒλžœμΉ˜μ— ν‘Έμ‹œν•˜μ„Έμš” (git push origin feature/amazing-feature)
  5. Pull Requestλ₯Ό μƒμ„±ν•˜μ„Έμš”

πŸ“‹ λ³€κ²½ 이λ ₯

μžμ„Έν•œ λ³€κ²½ 이λ ₯은 CHANGELOG.mdλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.


πŸ“„ λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ μŠ€ ν•˜μ— λ°°ν¬λ©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ LICENSE νŒŒμΌμ„ μ°Έμ‘°ν•˜μ„Έμš”.

πŸ™ κ°μ‚¬μ˜ 말

  • Swift Syntax νŒ€μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€
  • Swift 맀크둜 μ‹œμŠ€ν…œμ„ κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€ Swift νŒ€μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€

DoraKit으둜 JSON 코딩을 λ”μš± κ°„λ‹¨ν•˜κ³  μ•ˆμ „ν•˜κ²Œ λ§Œλ“€μ–΄λ³΄μ„Έμš”! πŸš€

About

No description, website, or topics provided.

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Languages