Как хранить Big Integer в Swift 4 Codable? - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь выполнить автоматический анализ API с помощью swift 4 codable. Некоторые из полей в API являются большими целыми числами, которые Codable не поддерживает, ни Swift 4.NSNumber не поддерживается Codable, и UInt64 является небольшим для его размещения. Я попытался использовать библиотеку сторонних разработчиков и сделал свою переменную внутри кодируемой для этого типа, но это также не сработало. Я пытался создать собственный класс или структуру, которая будет выполнять преобразование только с одним значением в контейнере, но не знаю, как заставить контейнер принимать тип Big Int или преобразовывать его в строку. Мой код ниже, как это. Есть ли какое-то решение?

import Foundation
import BigNumber

class PersonalizationLean:Codable {

    var hubId:String?
    var appId:UInt8?
    var nodeId:Int?
    var name:String?
    var ico:String?
    var icoBase64:String?
    var isBin:Bool?
    var lastModifiedAt:Int?
    var shouldShowInUi:Bool?
    var applianceType:String?
    var tags:[String]?
    var placeId:PlaceIdCodable?
    var roomId:String?
    var id:String?
    var key:String?


    enum CodingKeys:String,CodingKey {
        case hubId
        case appId
        case nodeId
        case name
        case ico
        case icoBase64
        case isBin
        case lastModifiedAt
        case shouldShowInUi
        case applianceType
        case tags
        case placeId
        case roomId
        case id
        case key
    }

//    required init(from decoder: Decoder) throws {
//        do {
//            let container = try decoder.container(keyedBy: CodingKeys.self)
//            self.hubId = try container.decode(String.self, forKey: .hubId)
//            self.appId = try container.decode(UInt8.self, forKey: .appId)
//            self.nodeId = try container.decode(Int.self, forKey: .nodeId)
//            self.name = try container.decode(String.self, forKey: .name)
//            self.ico = try container.decode(String.self, forKey: .ico)
//            self.icoBase64 = try container.decode(String.self, forKey: .icoBase64)
//            self.isBin = try container.decode(Bool.self, forKey: .isBin)
//            self.lastModifiedAt = try container.decode(Int.self, forKey: .lastModifiedAt)
//            self.shouldShowInUi = try container.decode(Bool.self, forKey: .shouldShowInUi)
//            self.applianceType = try container.decode(String.self,forKey: .applianceType)
//            self.tags = try container.decode([String].self,forKey: .tags)
//
//
//        }catch {
//            print(error)
//        }
//    }

}

class PlaceIdCodable:Codable {
    var placeId:String?

    required init(from decoder:Decoder) throws {
        do  {
            let container = try decoder.singleValueContainer()
            let placeIdBig = try container.decode(BInt.self) //this gives error
        }catch {
            print(error)
        }

    }

}

Библиотека, которую я использую: BigNumber

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

BInt не соответствует Codable ИЛИ Decodable

, чтобы использовать это здесь, это должно подтвердить к упомянутому протоколу

extension BInt: Decodable {
    public init(from decoder: Decoder) throws {
        // Initialization goes here
    }
}
0 голосов
/ 30 августа 2018

Использовать встроенную Десятичную , которая получается из NSDecimalNumber . Он принимает Codable

...