Convertible
将基本类型和模型转换为 JSON、二进制数据等,是应用开发中的常见任务。Convertible
定义了一系列 Swift 协议和实现,使得转换过程变得简单,因此您无需编写样板代码。
安装
Convertible
通过 CocoaPods 提供。要安装,只需在您的 podfile 中包含以下行
use_frameworks!
pod 'Convertible'
确保在您的 .swift 文件顶部导入该模块
import Convertible
或者,克隆此仓库或下载它作为 zip 文件并将在项目中包含类。
数据
在 iOS/OSX 开发中,与 NSData
一起工作是一个既定事实。Convertible
使得将您的 Swift 和 Cocoa 类型以及您自己的自定义模型转换为 NSData
变得很容易。
DataConvertible
Convertible
框架定义了一个通用的协议 DataConvertible
,用于在 NSData
之间进行转换。
protocol DataConvertible : DataInitializable, DataSerializable {
static func initializeWithData(data: NSData, options: [ConvertibleOption]) throws -> Self
func serializeToDataWithOptions(options: [ConvertibleOption]) throws -> NSData
}
DataConvertible
使得从一个 NSData
对象创建任何符合规范的类型变得容易(以及将数据序列化回 NSData
也变得简单)。
let data = // Some arbitrary NSData...
let string = try String.initializeWithData(data, options: [])
let newData = try string.serializeToDataWithOptions([])
以下类型包括默认实现:
NSString
NSArray
NSDictionary
NSSet
NSImage
UIImage
Swift.String
Swift.Array
Swift.Dictionary
Swift.Set
来自 Convertible
框架的类型,如 Convertible
或 JsonValue
,也实现了 DataConvertible
。你可以扩展自己的自定义类型以实现 DataConvertible
,以便利用这个强大的惯例。
JSON
在当今时代,似乎没有什么是比 JSON 更普遍的。但是使用常规方法将对象转换为 JSON 或从 JSON 转换回对象可能是一个大麻烦。《Convertable》通过定义带有 JsonConvertible
和 JsonValue
的标准协议和值类型抽象来简化与 JSON 的工作。
JsonConvertible
JsonConvertible
定义了一个简单的协议,用于在 JsonValue
之间进行转换。
protocol JsonConvertible {
static func initializeWithJson(json: JsonValue, options: [ConvertibleOption]) throws -> Self
func serializeToJsonWithOptions(options: [ConvertibleOption]) throws -> JsonValue
}
Convertible
为最常见的 Cocoa 和 Swift 类型提供了默认实现。
NSString
NSArray
NSDictionary
NSNumber
NSNull
NSSet
NSURL
NSImage
UIImage
Swift.Array
Swift.Bool
Swift.Dictionary
Swift.Double
Swift.Float
Swift.Int
Swift.Optional
Swift.Set
Swift.String
通过实现 JsonConvertible
来扩展任何其他类型,并利用 JSON 的力量为你的自定义类型提供支持!
JsonValue
JsonValue
是一个枚举抽象,表示 JSON 实体可能采取的所有可能的值(如 NSJSONSerialization 返回的)。
public enum JsonValue {
case String(NSString)
case Number(NSNumber)
case Array([JsonValue])
case Dictionary([NSString : JsonValue])
case Null(NSNull)
public init(object: AnyObject) throws
public var object: AnyObject { get }
}
由于 JsonValue
符合 DataConvertible
,它提供了一种更简单的方式来考虑 JSON 响应的可能值。
let json = try JsonValue.initializeWithData(data)
switch json {
case .String(let string): // It's a string!!
case .Number(let number): // It's a number!!
case .Array(let array): // It's an array!!
case .Dictionary(let dictionary): // It's a dictionary!
case .Null(_): // This JSON value is null. Nothing to see here.
}
模型
Convertable
使定义模型变得容易。只需创建一个符合 Convertable
的类或结构体即可!
class User : Convertible {
var id: Int
var name: String
var friend: User?
var created: NSDate?
}
Convertable
实现了所有转换协议。因此,从 NSData
创建新的 User
非常简单。
let data = // Some JSON NSData from a HTTP request...
let user = try User.initializeWithData(data)
键映射
JSON键值的默认标准是蛇形命名法(例如,this_is_a_json_property),而不是驼峰命名法。《Convertible》支持自动将下划线映射到驼峰命名法的功能,直接在你的模型定义中添加UnderscoreToCamelCase
协议即可。
class User : Convertible, UnderscoreToCamelCase {
var firstName: String
var lastName: String
var bestFriend: User?
var createdAt: NSDate?
}
你还可以指定自定义键映射
class User : Convertible, UnderscoreToCamelCase {
var firstName: String
var lastName: String
var isPublic: Bool
static var keyMapping = ["isPublic" : "public"] // [PropertyKey : MappedKey]
}
作者
Brad Hilton, [email protected]
许可
Convertible
遵循 MIT 许可协议。更多信息请参阅 LICENSE 文件。