Encoding and Decoding Custom Types
EncodingとDecoding CustomTypeの正式なドキュメント
ほとんどのプログラミングタスクには、ネットワーク接続を介してデータを転送したり、ディスクにデータを保存したり、APIやサービスにデータをコミットしたりすることが含まれます.データ転送中には、通常、データを中間フォーマットおよび転送フォーマットで符号化および復号する必要がある.
SWIFT標準ライブラリは、データの符号化および復号化の標準的な方法を定義する.それは、
タイプを組み合わせる最も簡単な方法は、すでに組み合わせることができるタイプを使用してPropertyを宣言することです.これらのタイプには、String、Int、Doubleなどの
ランドマーク名と年を設定するランドマーク構造を考慮してください.
同様の原則は、他のユーザー定義タイプからなるユーザー定義タイプにも適用され、これらのユーザー定義タイプはマージできます.すべてのプロパティがコピー可能である場合、すべてのカスタムタイプもコピー可能です.
次の例では、位置プロファイルがLandmarkタイプに追加された場合に、
次の例では、Landmarkに組み込まれたコピー可能なタイプを使用して複数のプロパティを追加する場合に、
場合によっては、双方向符号化および復号化をサポートするためにCodableを必要としない場合がある.たとえば、一部のアプリケーションでは、同じタイプの応答を復号することなく、リモートネットワークAPIを呼び出すだけです.データ符号化のみがサポートされている場合、宣言は
次の例は、データのみを符号化または復号化するLandmarkタイプの
インスタンスを復号するときに輪郭が表示されない場合、または一部の輪郭が符号化表現に含まれない場合、
次の例では、LandmarkタイプのnameおよびfoundingYear Propertyを、符号化および復号化の際に置換キーを使用して置き換えます.
SWIFTタイプの構造が符号化フォームの構造と異なる場合、符号化および復号ロジックを定義するために
次の例では、Coordinateを展開して、AdditionalInfoコンテナにネストされた仰角プロファイルをサポートします.
次の例では、Coordinateタイプは、必要な頭文字Limit(init:from:)を実装することによってDecodableプロトコルに適合するように拡張される.
以下の例では、
符号化および復号化プロセスをカスタマイズする際に使用される
未完了
外部表現(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を参照してください.未完了
Reference
この問題について(Encoding and Decoding Custom Types), 我々は、より多くの情報をここで見つけました https://velog.io/@yescoach/Encoding-and-Decoding-Custom-Typesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol