Decodable은 Swift에서 제공하는 프로토콜로, JSON과 같은 외부 데이터를 Swift 객체로 변환할 때 사용됩니다. 주로 API로부터 받은 JSON 데이터를 Swift 구조체나 클래스로 쉽게 변환하기 위해 사용되며, 이를 디코딩(Decoding)한다고 합니다. Decodable을 사용하면 각 속성을 일일이 매핑하지 않아도 Swift가 자동으로 데이터를 적절한 속성으로 매핑해줍니다.
Decodable의 기본 사용법
Decodable 프로토콜을 사용하려면, 먼저 디코딩하려는 Swift 구조체 또는 클래스가 Decodable 프로토콜을 채택해야 합니다.
1. 간단한 구조체 예시
struct User: Decodable {
let id: Int
let name: String
let email: String
}
위와 같이 구조체가 Decodable을 채택하고 있으면, JSON 데이터를 이 구조체로 변환할 수 있습니다.
2. JSON 데이터를 Swift 객체로 변환
다음과 같은 JSON 데이터가 있다고 가정해 봅시다:
{
"id": 1,
"name": "John Doe",
"email": "john@example.com"
}
이 데이터를 User 구조체로 변환하기 위해 JSONDecoder를 사용합니다:
let jsonData = """
{
"id": 1,
"name": "John Doe",
"email": "john@example.com"
}
""".data(using: .utf8)!
do {
let decoder = JSONDecoder()
let user = try decoder.decode(User.self, from: jsonData)
print(user.name) // 출력: John Doe
} catch {
print("Failed to decode JSON: \(error)")
}
3. 키 매핑
JSON의 키와 Swift의 프로퍼티 이름이 다를 경우 CodingKeys라는 커스텀 열거형을 사용하여 키를 매핑할 수 있습니다.
struct User: Decodable {
let id: Int
let username: String
let email: String
enum CodingKeys: String, CodingKey {
case id
case username = "name" // JSON의 "name" 키를 username에 매핑
case email
}
}
이 경우 JSON의 "name"이라는 키가 User 구조체의 username 속성으로 매핑됩니다.
4. 중첩된 데이터 디코딩
만약 JSON에 중첩된 데이터가 있을 경우, 해당 데이터 구조를 그대로 Swift 구조체로 표현하면 됩니다.
struct Address: Decodable {
let street: String
let city: String
}
struct User: Decodable {
let id: Int
let name: String
let address: Address
}
그리고 JSON 데이터가 다음과 같이 중첩되어 있다면:
{
"id": 1,
"name": "John Doe",
"address": {
"street": "123 Main St",
"city": "New York"
}
}
이 데이터를 Swift 객체로 변환하면 Address 구조체가 자동으로 User 구조체 내의 address 프로퍼티에 매핑됩니다.
요약
- Decodable: 외부 데이터(JSON 등)를 Swift 객체로 변환하기 위한 프로토콜.
- JSONDecoder: JSON 데이터를 Swift 구조체나 클래스로 디코딩하는 데 사용.
- CodingKeys: JSON 키와 Swift 속성 이름이 다를 때 매핑을 제공.
- 중첩 데이터: 구조체 내부에 중첩된 데이터를 쉽게 변환 가능.
이 방식은 API로부터 JSON 데이터를 받아오는 경우 매우 편리하게 사용할 수 있습니다.
'Category > Swift' 카테고리의 다른 글
private init() 스위프트에서 생성자를 private으로 설정하기 (0) | 2024.10.01 |
---|---|
@escaping 키워드는 언제 사용할까 (0) | 2024.10.01 |
클로저(Closure)란? (0) | 2024.10.01 |