What is Codable?
codable
A value that describes the contents of this path in a serializable format.
コード化可能
このパスの内容をシリアライズ可能な形式で記述した値。
公式だけだと分かりずらいな💦
✅内部実装を見てみる
/// A type that can convert itself into and out of an external representation.
///
///Codable
is a type alias for theEncodable
andDecodable
protocols.
/// When you useCodable
as a type or a generic constraint, it matches
/// any type that conforms to both protocols.
public typealias Codable = Decodable & Encodable
/// 自身を外部表現に変換したり、外部表現から変換したりできる型。
///
///Codable
はEncodable
とDecodable
プロトコルの型エイリアスである。
///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