Swift4+推荐官方的Codable 和 JSONDecoder,项目中有可参考的代码
JSONDecoder 和 TTReflect的对比
JSONDecoder:
√ JSONDecoder是原生支持
√ 使用结构体(值类型)作为模型
√ 映射对象和数组属性时更简单
× 有自定义的属性映射时需要重写所有属性
× 无法映射不同类型的属性
TTRflect:
√ 自定义的属性映射只需要改写相应的属性
√ 全面的类型映射,对json有更高的容错性
× 使用Class作为模型,需要依赖NSObject的KVC (致命问题)
-
切换到
master
分支, 手动拖拽Reflect.swift
文件到你的项目中 -
CocoaPods
pod 'TTReflect', '~> 4.0.0'
-
切换到
swift3
分支, 手动拖拽Reflect.swift
文件到你的项目中 -
CocoaPods (版本1.1.1或更高)
pod 'TTReflect', '~> 3.0.0'
-
切换到
swift2.3
分支, 手动拖拽Reflect.swift
文件到你的项目中 -
Cocoapods
pod 'TTReflect', '2.1.0'
将Reflect.swift
拖到项目中即可使用
platform :ios, '8.0'
use_frameworks!
pod 'TTReflect', '~> 3.0'
使用前需要导入框架
import TTReflect
=======
class Tag: NSObject {
var count: Int = 0
var name: String = ""
var title: String = ""
var isOpen: Bool = false
}
推荐所有的属性都使用默认值,能够避免在原始数据错误时,过多的可选判断或空对象崩溃
1.模型需要继承于NSObject
2.Int等基本属性需要设置默认值
3.对象属性可以使用可选类型
各类模型定义方式,详见 测试模型
// e.g. 模型为Tag类
// convert json to object
let tag = Reflect<Tag>.mapObject(json: json)
// convert data to object
let tag = Reflect<Tag>.mapObject(data: data)
// convert json to object array
let tags = Reflect<Tag>.mapObjects(json: json)
// convert data to object array
let tags = Reflect<Tag>.mapObjects(data: data)
具体见代码示例
let book = Reflect<Book>.mapObject(json: json)
let book = Reflect<Book>.mapObject(data: data)
let casts = Reflect<Cast>.mapObjects(json: json)
let casts = Reflect<Cast>.mapObjects(data: data)
=======
补充方法皆遵守于协议,可代码提示
希望将json的title
属性对应到模型的tt
属性
func setupMappingReplaceProperty() -> [String : String] {
return ["tt": "title"]
}
需要指定子类模型的key以及子类的类名
func setupMappingObjectClass() -> [String : AnyClass] {
return ["images": Images.self]
}
需要指定子类模型数组的key以及子类的类名
func setupMappingElementClass() -> [String : AnyClass] {
return ["tags": Tag.self]
}
指定需要忽略的属性名
func setupMappingIgnorePropertyNames() -> [String] {
return ["tags"]
}
class TTNull: NSObject {
}
class Book: NSObject {
var tt: String = ""
var pubdate: String = ""
var image: String = ""
var binding: String = ""
var pages = 0
var alt: String = ""
var id: String = ""
var publisher: String = ""
var summary: String = ""
var price: String = ""
var secretly: Bool = false
var imgs = Images()
var tags = [Tag]()
var test_null = TTNull()
func setupMappingReplaceProperty() -> [String : String] {
return ["tt": "title", "imgs": "images"]
}
func setupMappingObjectClass() -> [String : AnyClass] {
return ["images": Images.self, "test_null": TTNull.self]
}
func setupMappingElementClass() -> [String : AnyClass] {
return ["tags": Tag.self]
}
}
=======
1.如果在使用过程中遇到bug,或是有期待的功能,请留下Issues联系我,我将尽快答复
2.如果希望能够完善这个框架,敬请pull request
E-mail: [email protected]