DoraKitμ Swiftμ Codable νλ‘ν μ½μ μν μλνλ JSON μ½λ© ν€ μμ±μ μ 곡νλ Swift λ§€ν¬λ‘ λΌμ΄λΈλ¬λ¦¬μ
λλ€. 볡μ‘ν CodingKeys enumμ μλμΌλ‘ μμ±ν νμ μμ΄, κ°λ¨ν λ§€ν¬λ‘λ₯Ό μ¬μ©νμ¬ JSON μ§λ ¬ν/μμ§λ ¬νλ₯Ό μλνν μ μμ΅λλ€.
- μλ CodingKeys μμ±:
@AutoCodingKeysλ§€ν¬λ‘λ‘ μλCodingKeysenum μμ± - 컀μ€ν
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 {
}κ°λ³ νλ‘νΌν°μ 컀μ€ν JSON ν€λ₯Ό μ§μ ν λ μ¬μ©ν©λλ€.
struct Product {
@JsonKey("product_id") let id: String
@JsonKey("product_name") let name: String
let price: Double // "price"λ‘ λ§€ν
}μ μ½μ¬ν:
letλλvarμ μΈμλ§ μ¬μ© κ°λ₯- λ¬Έμμ΄ λ¦¬ν°λ΄λ§ μΈμλ‘ νμ©
- λΉ λ¬Έμμ΄μ νμ©νμ§ μμ
- νλμ νλ‘νΌν°μ νλμ
@JsonKeyλ§ μ¬μ© κ°λ₯
ꡬ쑰체λ ν΄λμ€μ μλ 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μ¬μ© λΆκ°
- ꡬ쑰체/ν΄λμ€μλ§ μ¬μ©: ν¨μλ λ€λ₯Έ μ μΈμλ μ¬μ© λΆκ°
- κΈ°μ‘΄ CodingKeysμ μΆ©λ: μ΄λ―Έ
CodingKeysenumμ΄λ 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+
- Swift Syntax 600.0.0+
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- μ μ₯μλ₯Ό ν¬ν¬νμΈμ
- κΈ°λ₯ λΈλμΉλ₯Ό μμ±νμΈμ (
git checkout -b feature/amazing-feature) - λ³κ²½μ¬νμ 컀λ°νμΈμ (
git commit -m 'Add some amazing feature') - λΈλμΉμ νΈμνμΈμ (
git push origin feature/amazing-feature) - Pull Requestλ₯Ό μμ±νμΈμ
μμΈν λ³κ²½ μ΄λ ₯μ CHANGELOG.mdλ₯Ό μ°Έμ‘°νμΈμ.
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€. μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έμ‘°νμΈμ.
- Swift Syntax νμκ² κ°μ¬λ립λλ€
- Swift λ§€ν¬λ‘ μμ€ν μ κ°λ₯νκ² ν΄μ€ Swift νμκ² κ°μ¬λ립λλ€
DoraKitμΌλ‘ JSON μ½λ©μ λμ± κ°λ¨νκ³ μμ νκ² λ§λ€μ΄λ³΄μΈμ! π