Convertible 5.0.2

Convertible 5.0.2

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后一次发布2019年3月
SPM支持SPM

Brad HiltonBrad Hilton 维护。



  • Brad Hilton

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 框架的类型,如 ConvertibleJsonValue,也实现了 DataConvertible。您可以扩展自己的自定义类型以实现 DataConvertible,以便利用这种强大的约定。

JSON

如今,似乎没有什么比 JSON 更为普遍。但是,使用常规方法将对象转换为 - 从 JSON 可能非常麻烦。《Convertible》通过定义 JsonConvertibleJsonValue 的标准协议和值类型抽象,使得处理 JSON 变得轻而易举。

JsonConvertible

JsonConvertible 定义了一个简单的协议,用于在 JsonValue 与其他类型之间进行转换。

protocol JsonConvertible {

    static func initializeWithJson(json: JsonValue, options: [ConvertibleOption]) throws -> Self

    func serializeToJsonWithOptions(options: [ConvertibleOption]) throws -> JsonValue
    
}

Convertible 包含了对最常见的 Cocoa 和 Swift 类型(如 NSStringNSNumberNSDate等)的默认实现。

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 文件。