Convertible
在应用程序开发中,将基本类型和模型转换为与 JSON、二进制数据等是常见的任务。 Convertible
定义了一系列 Swift 协议和实现,使转换过程变得简单,因此您无需编写样板代码。
安装
通过 CocoaPods 获取 Convertible
。要安装,只需在您的 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 可能非常麻烦。《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
、NSNumber
、NSDate
等)的默认实现。
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
是 NSJSONSerialization 返回的所有可能的 JSON 实体值的枚举抽象。
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),而不是驼峰式命名法。《可转换》支持开箱即用的下划线到驼峰式的自动映射。只需将 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 文件。