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.遵循可分解协议