DarkModel 0.2.1

DarkModel 0.2.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2017年8月
SwiftSwift版本3.1
SPM支持SPM

Dark Dong维护。



DarkModel 0.2.1

  • Dark Dong

一个轻量级的Swift库,能够通过反射自动从JSON创建模型。

需求

iOS 8.0, Swift 3.1

安装

手动

下载并添加源文件到您的项目

使用

如果您使用框架

import DarkModel

您的所有模型类必须继承自Model

基本用法

// JSON:
{
    "name": "Dark",
    "age": 24,
    "hobbies": ["Metal", "Game"],
    "homePage": "http://odetodark.com"
    "lover": {
        "name": "Yu",
        "age": 16,
        "birthday": 827251200
        "hobbies": ["Shopping", "Eating", "Dancing"]
    }
}

// Model:
class PersonModel: Model {
    var name = ""
    var age = 0
    var homePage: URL!
    var birthday: Date?
    var hobbies = [String]()
    var lover: PersonModel?
}

let person = PersonModel(json: json)
let json = person.json()

使用不同的JSON键

// JSON:
{
    "user_name": "Dark",
    "age": 24,
}

// Model:
class PersonModel: Model {
    override class var propertyToJSONKeyMapper: [String: String] {
        return ["name": "user_name"]
    }
    var name = ""
    var age = 0
}

属性是集合,并且包含无法自动转换的对象

// JSON:
{
    "name": "Dark",
    "age": 24,
    "friends": [
        {
            "name": "Ricky",
            "age": 18,
        },
        {
            "name": "Linda",
            "age": 25,
        }
    ],
    "moments": [
        827251200,
        1218124800,
    ]
}

// Model:
class PersonModel: Model {
    override class var propertyToCollectionElementTypeMapper: [String: AnyClass] {
        return ["friends": PersonModel.self, "moments": NSDate.self]
    }
    var name = ""
    var age = 0
    var friends = [PersonModel]()
    var moments = [Date]()
}

属性是可选Int类型

// JSON:
{
    "user_name": "Dark",
    "age": 24,
}

// Model:
class PersonModel: Model {
    var name = ""
    var age: Int?

    required init(json: Any?) {
        super.init(json: json)
        
        if let dic = json as? [String: Any] {
            age = dic[jsonKey("age")] as? Int
        }
    }
    
    override func json() -> [String : Any] {
        var dic = super.json()
        if let value = age {
            dic[jsonKey("age")] = value
        }
        return dic
    }
}

使用自定义转换器

    // JSON:
    {
        "birthday": "1996-03-20"
    }

    // Model:
    class PersonModel: Model {
        var birthday: Date!
        
        override func objectFromJSON(_ json: Any?, for property: String) -> Any? {
            switch property {
            case "birthday":
                let formatter = DateFormatter()
                formatter.dateFormat = "yyyy-MM-dd"
                if let string = json as? String {
                    return formatter.date(from: string)
                } else {
                    return nil
                }
            default:
                return nil
            }
        }
        
        override func jsonFromObject(_ object: Any, for property: String) -> Any? {
            switch property {
            case "birthday":
                let formatter = DateFormatter()
                formatter.dateFormat = "yyyy-MM-dd"
                return formatter.string(from: object as! Date)
            default:
                return nil
            }
        }
    }

许可证

DarkModel是在MIT许可证下发布的。有关详细信息,请参阅LICENSE

DarkModel中文简介

一个轻量级的JSON转模型库, Swift实现。

系统需求

iOS 8.0, Swift 3.1

安装

手动

下载并添加源文件到您的项目

使用方法

如果使用框架的话

import DarkModel

所有类 必须 继承自Model

零配置用法

// JSON:
{
    "name": "Dark",
    "age": 24,
    "hobbies": ["Metal", "Game"],
    "homePage": "http://odetodark.com"
    "lover": {
        "name": "Yu",
        "age": 16,
        "birthday": 827251200
        "hobbies": ["Shopping", "Eating", "Dancing"]
    }
}

// Model:
class PersonModel: Model {
    var name = ""
    var age = 0
    var homePage: URL!
    var birthday: Date?
    var hobbies = [String]()
    var lover: PersonModel?
}

let person = PersonModel(json: json)
let json = person.json()

使用不同的 JSON 键值

// JSON:
{
    "user_name": "Dark",
    "age": 24,
}

// Model:
class PersonModel: Model {
    override class var propertyToJSONKeyMapper: [String: String] {
        return ["name": "user_name"]
    }
    var name = ""
    var age = 0
}

属性字段是个集合,并且包含不能自动转换的类型

// JSON:
{
    "name": "Dark",
    "age": 24,
    "friends": [
        {
            "name": "Ricky",
            "age": 18,
        },
        {
            "name": "Linda",
            "age": 25,
        }
    ],
    "moments": [
        827251200,
        1218124800,
    ]
}

// Model:
class PersonModel: Model {
    override class var propertyToCollectionElementTypeMapper: [String: AnyClass] {
        return ["friends": PersonModel.self, "moments": NSDate.self]
    }
    var name = ""
    var age = 0
    var friends = [PersonModel]()
    var moments = [Date]()
}

属性类型为 Optional Int

// JSON:
{
    "user_name": "Dark",
    "age": 24,
}

// Model:
class PersonModel: Model {
    var name = ""
    var age: Int?

    required init(json: Any?) {
        super.init(json: json)
        
        if let dic = json as? [String: Any] {
            age = dic[jsonKey("age")] as? Int
        }
    }
    
    override func json() -> [String : Any] {
        var dic = super.json()
        if let value = age {
            dic[jsonKey("age")] = value
        }
        return dic
    }
}

自定义转换

    // JSON:
    {
        "birthday": "1996-03-20"
    }

    // Model:
    class PersonModel: Model {
        var birthday: Date!
        
        override func objectFromJSON(_ json: Any?, for property: String) -> Any? {
            switch property {
            case "birthday":
                let formatter = DateFormatter()
                formatter.dateFormat = "yyyy-MM-dd"
                if let string = json as? String {
                    return formatter.date(from: string)
                } else {
                    return nil
                }
            default:
                return nil
            }
        }
        
        override func jsonFromObject(_ object: Any, for property: String) -> Any? {
            switch property {
            case "birthday":
                let formatter = DateFormatter()
                formatter.dateFormat = "yyyy-MM-dd"
                return formatter.string(from: object as! Date)
            default:
                return nil
            }
        }
    }

许可证

DarkModel 使用 MIT 许可证。 详见See LICENSE