0

I have a 2 class , one of them inherited from base class

Base class

class Member : NSObject , Codable{
var Address : String?
var BriefDescription : String?
var City : String?
}

This is my inherited class :

class MemberSingUp : Member {
var Password : String?
var passwordAgain : String?
var referansNumber : String?
}

I created and object then load datas into it.

    var newMember = MemberSingUp()
    newMember.Address = "Adress"
    newMember.BriefDescription = "BriefDescription"
    newMember.City = "City"
     
    newMember.Password = "123456"

Then I try to encode this model like

        var memberJson : String = ""
    do{
        let jsonEncoder = JSONEncoder()
        let jsonData = try jsonEncoder.encode(newMember)
       
        memberJson = String(data: jsonData, encoding: String.Encoding.utf8)!

    }catch{}
    print(memberJson)

This memberJson is {"Address":"Adress","BriefDescription":"BriefDescription","City":"City"}. Password doesnt encode

So,Why inherited class object doesn't encoding?

UPDATE: According to Comment I use

required init(from decoder: Decoder) throws {

    let container = try decoder.container(keyedBy: CodingKeys.self)
    let superdecoder = try container.superDecoder()
    try super.init(from: superdecoder)

    Password = try container.decode(String.self, forKey: .Password)
    

}

override func encode(to encoder: Encoder) throws {

    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(Password, forKey: .Password)


    let superencoder = container.superEncoder()
    try super.encode(to: superencoder)

}

It changes the json like :

{"Password":"1234567","super":{"Address":"Address","BriefDescription":"BriefDescription","City":"City"}}

How can I delete this super key

Omer Tekbiyik
  • 4,255
  • 1
  • 15
  • 27
  • 1
    The `Codable` protocol doesn’t support inheritance by default. Please see https://stackoverflow.com/questions/44553934/using-decodable-in-swift-4-with-inheritance – vadian Oct 09 '20 at 11:51
  • I saw it and it work but It adds "super" key to base class json. Have can I delete this. Updated the question @vadian – Omer Tekbiyik Oct 09 '20 at 11:58

1 Answers1

4

It's not difficult:

override func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(Password, forKey: .Password)

    try super.encode(to: encoder)
}

No need to create nested encoders.

It works the same with decoding:

required init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    Password = try container.decode(String.self, forKey: .Password)
    try super.init(from: decoder)
}
Sulthan
  • 128,090
  • 22
  • 218
  • 270