Swift Codable init

后端 未结 2 1636
一整个雨季
一整个雨季 2021-02-08 11:13

I would like to do some initialization logic after the Swift Coding/Encoding feature has finished decoding a JSON.

struct MyStruct: Codable {
    let id: Int 
           


        
2条回答
  •  攒了一身酷
    2021-02-08 12:07

    Use a factory method that first uses init(from:) and then calls your custom initialization code

    struct Foo: Decodable {
        let name: String
        let id: Int
    
        var x: String!
    
        private mutating func finalizeInit() {
            self.x = "\(name) \(id)"
        }
    
        static func createFromJSON(_ data: Data) -> Foo? {
            guard var f = try? JSONDecoder().decode(Foo.self, from: data) else { 
                return nil 
            }
            f.finalizeInit()
            return f
        }
    }
    
    let sampleData = """
        { "name": "foo", "id": 42 }
        """.data(using: .utf8)!
    let f = Foo.createFromJSON(sampleData)
    

提交回复
热议问题