🪶

What is Codable?

2024/08/04に公開

codable

A value that describes the contents of this path in a serializable format.

コード化可能
このパスの内容をシリアライズ可能な形式で記述した値。

公式だけだと分かりずらいな💦
https://developer.apple.com/documentation/swiftui/navigationpath/codable/

✅内部実装を見てみる

/// A type that can convert itself into and out of an external representation.
///
/// Codable is a type alias for the Encodable and Decodable protocols.
/// When you use Codable as a type or a generic constraint, it matches
/// any type that conforms to both protocols.
public typealias Codable = Decodable & Encodable

/// 自身を外部表現に変換したり、外部表現から変換したりできる型。
///
/// CodableEncodableDecodable プロトコルの型エイリアスである。
/// Codable を型やジェネリック制約として使用する場合、以下のようにマッチする。
/// 両方のプロトコルに準拠する任意の型にマッチする。
public typealias Codable = Decodable & Encodable

🔧使う場面

API通信をするときに、JSONをSwiftのコードに、デコードするロジックを実装するときに使用する。JSONのデータを取得して、それをオブジェクトに変換するということかな。arrayの中に、加工したデータが入っているので、Viewに表示することができる。

import SwiftUI
import Observation

@Observable
class ProductManager {
    var products: [Product] = []
    var isLoading = false
    var errorMessage: String?
    
    func fetchProducts() {
        isLoading = true
        errorMessage = nil
        
        guard let url = URL(string: "https://hono-shop-app.gitonly543.workers.dev/api/shop") else {
            errorMessage = "Invalid URL"
            isLoading = false
            return
        }
        
        URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
            DispatchQueue.main.async {
                self?.isLoading = false
                
                if let error = error {
                    self?.errorMessage = error.localizedDescription
                    return
                }
                
                guard let data = data else {
                    self?.errorMessage = "No data received"
                    return
                }
                
                do {
                    let decodedProducts = try JSONDecoder().decode([Product].self, from: data)
                    self?.products = decodedProducts
                } catch {
                    self?.errorMessage = "Failed to decode data: \(error.localizedDescription)"
                }
            }
        }.resume()
    }
}

まとめ

Codableの役割とは、自身を外部表現に変換したり、外部表現から変換したりできる型。つまりJSONのエンコード、デコードをするときに、使う場面があった。

Discussion