测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | zlib |
发布最后发布 | 2017年5月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Baris Sencan,Baris Sencan 维护。
将任何东西转换为任何东西,一气呵成;十六进制字符串转换为 UIColor/NSColor,JSON 字符串转换为类实例,y/n 字符串转换为布尔值,这些数组和字典;你所能理解的一切!
最新版本需要 iOS 8+ 和 Xcode 7.3+
<--
运算符取其右侧的值并尝试将其转换为左侧值的类型。如果转换失败,则在调试构建中记录错误。如果成功,则替换左侧变量的值。它也可以连续使用。
如果右侧值是 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方式。