2017-11-02 9 views
0

Swiftでは、CodingKeyは構造体上でCodableプロトコルを使用するためにenumで使用されているプロトコルはなぜですか?Swiftでは、CodingKeyは構造体上でCodableプロトコルを使用するためにenumで使用されているプロトコルはなぜですか?

私はこれをあまりにも多くの点でテストしていませんが、私が見つけたすべての例を複製しようとしています。列挙型でCodableプロトコルを使用するだけで完璧な動作が得られます。

// This throws Error 
struct Foo: Codable { //! Type 'Foo' does not conform to protocol 'Codable' 

    var id: String 
    var name: String 
    var type: MyType 
    var order: Int 

    enum MyType: String, CodingKey { 
     case this 
     case that 
     case and 
     case theOtherThing 
    } 

} 

// This doesn't 
struct Foo: Codable { 

    var id: String 
    var name: String 
    var type: MyType 
    var order: Int 

    enum MyType: String, Codable { 
     case this 
     case that 
     case and 
     case theOtherThing 
    } 
} 

答えて

1

なぜコーディングキーを使用するには?

あなたのシリアライズされたデータフォーマットで使用されるキーがCodingKeys 列挙の生の値の型として文字列を指定する ことで代替キーを提供し、あなたのデータ型から プロパティ名と一致しない場合。

例: -

JSON -

let jsonExample = """ 
{ 
     "id":1, 
     "name_Of_person":"jack", 
     "emailId":"[email protected]" 
} 
""".data(using: .utf8)! 

struct作成Codableプロトコル

struct UserData: Codable { 
    var id: Int 
    var name: String 
    var email: String 
    //Set JSON key values for fields in our custom type 
    private enum CodingKeys: String, CodingKey { 
     case id //Leave it blank because id matches with json Id 
     case name = "name_Of_person" 
     case email = "emailId" 
    } 
    init(from decoder: Decoder) throws { 
     let values = try decoder.container(keyedBy: CodingKeys.self) 
     id = try values.decode(Int.self, forKey: .id) 
     name = try values.decode(String.self, forKey: .name) 
     email = try values.decode(String.self, forKey: .email) 
    } 
} 
に準拠

Usage-

//Decode struct using JSONDecoder 

    let jsonDecoder = JSONDecoder() 
    do { 
     let modelResult = try jsonDecoder.decode(UserData.self,from: jsonExample) 
     print("id is \(modelResult.id) - Name is \(modelResult.name) - email is \((modelResult.email))") 
    } catch { 
     print(error) 
    } 
+0

この記事を取り巻くドキュメントは、より良いものにする必要があります。あるいは、Swiftコミュニティの開発にもっと関わっていく必要があります。 – Sethmr

3

struct Fooのすべてのプロパティは、コーディング可能でなければなりません。それにはMyTypeが含まれます。 CodingKeyはJSON辞書で使用される文字列を指定します。これはCodableと同じではありません。 id、name、orderフィールドは既にコーディング可能です。標準ライブラリによって提供されます。

更新 この拡張機能をFooに追加すると、構造体フィールドのラベルをJSONにエンコード/デコードする方法を変更できます。私は任意にあなたのプロパティの2つにmy_をプリペアしました。

extension Foo { 
    enum CodingKeys: String, CodingKey { 
    case id 
    case name 
    case type = "my_type" 
    case order = "my_order" 
    } 
} 

enter image description here

+0

それはどのように使用される文字列を指定していますか?簡単なユースケースを教えてください。ありがとう!! – Sethmr

関連する問題