JSONHelper 2.2.0

JSONHelper 2.2.0

测试已测试
语言语言 SwiftSwift
许可证 zlib
发布最后发布2017年5月
SwiftSwift 版本3.0
SPM支持 SPM

Baris SencanBaris Sencan 维护。



JSONHelper

将任何东西转换为任何东西,一气呵成;十六进制字符串转换为 UIColor/NSColor,JSON 字符串转换为类实例,y/n 字符串转换为布尔值,这些数组和字典;你所能理解的一切!

最新版本需要 iOS 8+ 和 Xcode 7.3+

目录

  1. 安装
  2. – 运算符
  3. 可转换协议
  4. 可反序列化协议(带有 JSON 反序列化示例)
  5. 可序列化协议

安装

– 运算符

<-- 运算符取其右侧的值并尝试将其转换为左侧值的类型。如果转换失败,则在调试构建中记录错误。如果成功,则替换左侧变量的值。它也可以连续使用。

如果右侧值是 nil 或转换失败,并且左侧变量是可选的,则将其赋予 nil。当左侧变量是非可选的,则不改变左侧变量的当前值。

使用此规范,假设您已从某 API 获取了一个字典响应,其中包含十六进制颜色字符串,并在 colors 键下。您想将其转换为 UIColor 实例的数组。此外,为了充分利用我们所知的一切,假设我们想要为不存在的键的值(是 nil)设置默认颜色数组值。

var colors = [UIColor.blackColor(), UIColor.whiteColor()]
// Assume we have response { "colors": ["#aaa", "#b06200aa"] }
colors <-- response[colorsKey]

可转换协议

如果您的类型是简单值类型,请采用可转换协议来使您的类型与 <-- 运算符协同工作。

示例

struct Vector2D: Convertible {
  var x: Double = 0
  var y: Double = 0

  init(x: Double, y: Double) {
    self.x = x
    self.y = y
  }

  static func convertFromValue<T>(value: T?) throws -> Self? {
    guard let value = value else { return nil }

    if let doubleTupleValue = value as? (Double, Double) {
      return self.init(x: doubleTupleValue.0, y: doubleTupleValue.1)
    }

    throw ConversionError.UnsupportedType
  }
}
var myVector: Vector2D?
myVector <-- (1.0, 2.7)

可反序列化协议

尽管您基本上可以为任何类型采用可转换协议,但如果您的类型始终从字典或 JSON 字符串转换,则使用可反序列化协议可以使事情变得更加简单。

示例

class User: Deserializable {
  static let idKey = "id"
  static let emailKey = "email"
  static let nameKey = "name"
  static let avatarURLKey = "avatar_url"

  private(set) var id: String?
  private(set) var email: String?
  private(set) var name = "Guest"
  private(set) var avatarURL = NSURL(string: "https://mysite.com/assets/default-avatar.png")

  required init(dictionary: [String : AnyObject]) {
    id <-- dictionary[User.idKey]
    email <-- dictionary[User.emailKey]
    name <-- dictionary[User.nameKey]
    avatarURL <-- dictionary[User.avatarURLKey]
  }
}
var myUser: User?
user <-- apiResponse["user"]

序列化协议

// 序列化功能即将推出。我可能不会添加一个全新的协议,而是将其重命名并更新Deserializable协议,使用mix-in方式。