Encoding and Decoding Custom Types


EncodingとDecoding CustomTypeの正式なドキュメント
外部表現(JSONなど)と互換性のあるデータ型の符号化および復号化を可能にする。

Overview


ほとんどのプログラミングタスクには、ネットワーク接続を介してデータを転送したり、ディスクにデータを保存したり、APIやサービスにデータをコミットしたりすることが含まれます.データ転送中には、通常、データを中間フォーマットおよび転送フォーマットで符号化および復号する必要がある.
SWIFT標準ライブラリは、データの符号化および復号化の標準的な方法を定義する.それは、사용자 지정 타입に対して符号化および復号プロトコルを実施することによって実現される.これらのプロトコルを使用すると、エンコーダおよびDecoderプロトコルを実装して、データをインポートし、JSONまたはPropertiesリストなどの外部表現に符号化または復号することができます.符号化と復号化を同時にサポートするには、EncodableプロトコルとDecodableプロトコルの基準を満たすことを宣言します.この手順では、タイプをコピーできます.

Encode and Decode Automatically


タイプを組み合わせる最も簡単な方法は、すでに組み合わせることができるタイプを使用してPropertyを宣言することです.これらのタイプには、String、Int、Doubleなどの표준 라이브러리 타입、Date、Data、URLなどのFoundation 타입があります.任意のタイプの組み合わせ可能な製品は、適合を宣言するだけで組み合わせられます.
ランドマーク名と年を設定するランドマーク構造を考慮してください.
struct LandMark {
    var name: String
    var foundingYear: Int
}
CodableをLandmarkの継承リストに追加すると、EncodableとDecodableのすべてのプロトコル要件を満たすことができます.
struct Landmark: Codable {
    var name: String
    var foundingYear: Int
    
    // Landmark now supports the Codable methods init(from:) and encode(to:), 
    // even though they aren't written as part of its declaration.
}
タイプに応じて、Codableを使用すると、자동 준수(automatic conformance)に組み込まれたデータフォーマットとカスタムエンコーダとデコーダが提供するフォーマットを提供できます.例えば、Landmark自体は、직렬화(Serialize)または프로퍼티 리스트を処理する特定のコードを含まないが、JSONおよびPropertyListEncoderクラスを使用して符号化することができる.
同様の原則は、他のユーザー定義タイプからなるユーザー定義タイプにも適用され、これらのユーザー定義タイプはマージできます.すべてのプロパティがコピー可能である場合、すべてのカスタムタイプもコピー可能です.
次の例では、位置プロファイルがLandmarkタイプに追加された場合に、JSONEncoderがどのように適用されるかを示します.
struct Coordinate: Codable {
    var latitude: Double
    var longitude: Double
}

struct Landmark: Codable {
    // Double, String, and Int all conform to Codable.
    var name: String
    var foundingYear: Int
    
    // Adding a property of a custom Codable type maintains overall Codable conformance.
    var location: Coordinate
}
内蔵タイプ(例えば、Codable 자동 준수Array、およびDictionary)は、複製可能タイプを含む場合にも複製可能性に合致する.Coordinateインスタンス配列はLandmarkに追加できますが、構造全体が複製性を満たしています.
次の例では、Landmarkに組み込まれたコピー可能なタイプを使用して複数のプロパティを追加する場合に、Optionalを適用する方法を示します.
struct Landmark: Codable {
    var name: String
    var foundingYear: Int
    var location: Coordinate
    
    // Landmark is still codable after adding these properties.
    var vantagePoints: [Coordinate]
    var metadata: [String: String]
    var website: URL?
}

Encode or Decode Exclusively


場合によっては、双方向符号化および復号化をサポートするためにCodableを必要としない場合がある.たとえば、一部のアプリケーションでは、同じタイプの応答を復号することなく、リモートネットワークAPIを呼び出すだけです.データ符号化のみがサポートされている場合、宣言は자동 준수に合致する.逆に、特定のタイプのデータのみを読み込む必要がある場合は、Encodableを遵守することを宣言します.
次の例は、データのみを符号化または復号化するLandmarkタイプのDecodableを示す.
struct Landmark: Encodable {
    var name: String
    var foundingYear: Int
}
struct Landmark: Decodable {
    var name: String
    var foundingYear: Int
}

Choose Properties to Encode and Decode Using Coding Keys

대체 선언タイプは、Codableプロトコルに準拠するCodingKeysを宣言することができる.この列挙がある場合、CodingKeys라는 이름의 특별한 중첩 열거형は、符号化または復号化の際に含まなければならない組合せ可能なタイプのインスタンスの許可케이스として機能するであろう.프로퍼티들의 리스트は、열거형 케이스의 이름と一致する必要があります.
インスタンスを復号するときに輪郭が表示されない場合、または一部の輪郭が符号化表現に含まれない場合、해당 타입의 프로퍼티에 지정한 이름列挙で輪郭は省略される.CodingKeyで省略されたPropertyは、タイプを含むDecodableまたはCodableに自動的に適合するには、CodingKeysが必要です.기본값직렬화된 데이터 포맷에 사용된 키と一致しない場合は、codingKey列挙タイプの데이터 타입의 속성 이름として文字列원시 값 타입を指定します.各列挙エンクロージャの元の値である대체 키를 제공は、符号化および復号化に使用される문자열である.SWIFT API設計ガイドに従って、エンクロージャ名と元の値との間の接続を使用して、モデリング中のシーケンス化されたフォーマットの名前、句読点、大文字を一致させることなく、データ構造の名前を指定できます.
次の例では、LandmarkタイプのnameおよびfoundingYear Propertyを、符号化および復号化の際に置換キーを使用して置き換えます.
struct Landmark: Codable {
    var name: String
    var foundingYear: Int
    var location: Coordinate
    var vantagePoints: [Coordinate]
    
    enum CodingKeys: String, CodingKey {
        case name = "title"
        case foundingYear = "founding_date"
        
        case location
        case vantagePoints
    }
}

Encode and Decode Manually


SWIFTタイプの構造が符号化フォームの構造と異なる場合、符号化および復号ロジックを定義するために키 이름を提供することができる.
次の例では、Coordinateを展開して、AdditionalInfoコンテナにネストされた仰角プロファイルをサポートします.
struct Coordinate {
    var latitude: Double
    var longitude: Double
    var elevation: Double

    enum CodingKeys: String, CodingKey {
        case latitude
        case longitude
        case additionalInfo
    }
    
    enum AdditionalInfoKeys: String, CodingKey {
        case elevation
    }
}
符号化Coordinateタイプは、第2のレベルのネスト情報を含むため、このタイプの사용자 정의 구현およびEncodableプロトコルは、2つの列挙タイプを使用し、各列挙タイプは、特定のレベルで使用されるDecodableを含む.
次の例では、Coordinateタイプは、必要な頭文字Limit(init:from:)を実装することによってDecodableプロトコルに適合するように拡張される.
extension Coordinate: Decodable {
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        latitude = try values.decode(Double.self, forKey: .latitude)
        longitude = try values.decode(Double.self, forKey: .longitude)
        
        let additionalInfo = try values.nestedContainer(keyedBy: AdditionalInfoKeys.self, forKey: .additionalInfo)
        elevation = try additionalInfo.decode(Double.self, forKey: .elevation)
    }
}
Coding Keysは、伝達されたInitializer法をパラメータとして使用してDecoder 인스턴스を充填する.Coordinateインスタンスの2つのPropertyは、SWIFT標準ライブラリが提供するCoordinate 인스턴스を使用して初期化される.
keyed container APIs...? ブラウズ

以下の例では、키 컨테이너 APIプロトコルに適応するために協調タイプを拡張するために必要な方法encode(to:):を実装する方法を示す.
extension Coordinate: Encodable {
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(latitude, forKey: .latitude)
        try container.encode(longitude, forKey: .longitude)
        
        var additionalInfo = container.nestedContainer(keyedBy: AdditionalInfoKeys.self, forKey: .additionalInfo)
        try additionalInfo.encode(elevation, forKey: .elevation)
    }
}
これらのencode(to:)メソッドの実装は、前の例の復号機能とは逆である.
符号化および復号化プロセスをカスタマイズする際に使用されるEncodableの詳細については、KeyedEncoding Container ProtocolおよびUnkeyedEncoding Containerを参照してください.
未完了