Swift 4中的可编码NSManagedObject(核心数据)和CLLocation
在进入主题之前,让我们先讨论一下编码。
可编码
CODE是Swift 4的新功能。它是Decodable协议的类型别名 和可编码协议。
typealias可编码=可分解和可编码
可以反序列化Decodable符合的枚举/结构/类。 例如,将json对象反序列化为结构。
// 宣言
struct Person:可分解{
命名:字符串
}
//反序列化
让jsonString =“”“
{
“名称”:“郑正祥”
}
“”
如果让jsonData = jsonString.data(使用:.utf8){
让人=尝试? JSONDecoder()。decode(Person.self,来自:jsonData)
}
Encodable遵循的 enum / struct / class可以序列化。 例如,一个结构被序列化为一个json对象。
// 宣言
结构人:可编码{
命名:字符串
}
//序列化
let person = Person(姓名:“郑正祥”)
让jsonData =试试吗? JSONEncoder()。encode(person)
上面的示例非常简单,但是显示了2个要点 。
如果自定义类型的所有属性都是可编码的,则它是可编码的。
字符串,整数,双精度型, 数据和URL是内置的可编码类型,因此Person是可编码的。
让我们看一个反例。
结构资产{
let属性:Int
}
struct Person:可编码{
命名:字符串
// 资产不可编码,因此人不能符合可编码
出租资产:资产
}
此外,诸如Array,Dictionary和Optional之类的内置类型只要包含可编码类型,就符合Codable。
2。
默认的编码/解码方式由编译器自动生成。
这意味着您无需担心编码 键映射 ! 编码/解码的默认方式将属性名称作为其键。
// 宣言
struct Person:可编码{
命名:字符串
}
let person = Person(姓名:“郑正祥”)
//人的序列化:{“名称”:“郑正祥”}
客制化
如果要自定义或省略某些编码键,则声明一个名为CodingKeys的特殊嵌套枚举,该枚举符合CodingKey协议。
// 宣言
struct Person:可编码{
命名:字符串
让性别:字符串
enum CodingKeys: String, CodingKey {
case name = "username"
}
}
let person = Person(姓名:“郑正祥”,性别:“男”)
//人的序列化:{“用户名”:“郑正祥”}
您还可以定义自己的编码/解码逻辑,以覆盖编码/解码可编码类型的默认方式。
// 宣言
struct Person {
命名:字符串
让性别:字符串
enum CodingKeys: String, CodingKey {
case firstName
case lastName
}
}
// 可分解
扩展人员:可分解{
init(from decoder: Decoder) throws {
}
let values = try decoder.container(keyedBy: CodingKeys.self)
let firstName = try values.decode(String.self, forKey: .firstName)
let lastName = try values.decode(String.self, forKey: .lastName)
name = firstName + " " + lastName
}
//可编码
扩展人员:可编码{
func encode(to encoder: Encoder) throws {
}
var container = encoder.container(keyedBy: CodingKeys.self)
let nameComponents = name.components(separatedBy: " ")
try container.encode(nameComponents[0], forKey: .firstName)
try container.encode(nameComponents[1], forKey: .lastName)
}
let person = Person(姓名:“郑正祥”)
//人的序列化:{“ firstName”:“ Zheng-Xiang”,“ lastName”:“ Ke”}
综上所述,有3个步骤可自定义您的逻辑以对可编码类型进行编码/解码。
步骤1.定义CodingKeys枚举
步骤2.遵循可编码协议
步骤3.遵循可分解协议