将基本类型和模型转换为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可能很痛苦。《Convertible》通过定义《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.
}
Convertible
使定义模型变得简单。只需创建一个遵守 Convertible
的类或结构体即可完成所有操作!
class User : Convertible {
var id: Int
var name: String
var friend: User?
var created: NSDate?
}
Convertible
实现了所有转换协议。因此,从 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 文件。