Skip to content

基本类型

xuyecan edited this page Sep 12, 2017 · 3 revisions

支持class

要支持从JSON串反序列化,Model定义时要声明服从HandyJSON协议。

服从HandyJSON协议,需要实现一个空的init方法。

class BasicTypes: HandyJSON {
    var int: Int = 2
    var doubleOptional: Double?
    var stringImplicitlyUnwrapped: String!

    required init() {}
}

let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1}"
if let object = BasicTypes.deserialize(from: jsonString) {
    // …
}

支持struct

对于声明为struct的Model,由于struct默认提供了空的init方法,所以不需要额外声明。

struct BasicTypes: HandyJSON {
    var int: Int = 2
    var doubleOptional: Double?
    var stringImplicitlyUnwrapped: String!
}

let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1}"
if let object = BasicTypes.deserialize(from: jsonString) {
    // …
}

通过Extension支持

如果希望尽量减少对原有代码的改动,那么可以通过Swift extension机制服从HandyJSON协议。如:

class Model {
    var type: MyEnumType?

    required init() {}
}

extension Model: HandyJSON {

    func mapping(mapper: HelpingMapper) {
        mapper <<<
            type <-- MyEnumTypeTransform()
    }
}

这种用法中,mapping/didFinishMapping函数都可以在扩展中实现,但是,init()函数仍然需要在原class中声明。