一、Swift Codable是什麼?
Swift Codable是蘋果推出的用於編碼和解碼的協議,可以使得我們在iOS應用程序開發中更加方便地進行數據的序列化和反序列化。
在前些年,我們需要手動編寫大量的代碼來實現數據的序列化和反序列化,但是現在使用Swift Codable協議可以大大簡化這個過程。
讓我們來看一下Swift Codable的用法:
struct Person: Codable {
var name: String
var age: Int
}
let json = """
{
"name": "Tommy",
"age": 25
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
do {
let person = try decoder.decode(Person.self, from: json)
print(person)
} catch {
print(error)
}
在上面的例子中,我們定義了一個Person結構體,並遵守了Codable協議。然後我們把一個JSON格式的字符串解析成了一個Person對象,這是Swift Codable的一個非常基礎的應用場景。
二、Codable的實現原理
在Swift中,編碼和解碼使用的是兩個不同的協議:
- Encodable
- Decodable
這兩個協議的定義非常簡單:
protocol Encodable {
func encode(to encoder: Encoder) throws
}
protocol Decodable {
init(from decoder: Decoder) throws
}
Encodable協議中有一個encode(to:)方法,用於將對象編碼成數據;Decodable協議中有一個init(from:)方法,用於將數據解碼成對象。
Swift Codable的許多魔法都隱藏在其下面實現的附加協議中。 它們是:
- SingleValueEncodingContainer
- SingleValueDecodingContainer
- UnkeyedEncodingContainer
- UnkeyedDecodingContainer
- KeyedEncodingContainer
- KeyedDecodingContainer
這個協議家族內部的每個協議都有非常清晰的功能劃分,使得Swift Codable可以輕易解析JSON、XML、屬性列表和其他格式的數據。
三、在Swift Codable中使用CodingKeys
當編寫代碼時,我們經常會需要將結構體中的名稱映射到鍵值對中不同的名稱。例如,我們可能有一個Swift結構體:
struct Person: Codable {
var firstName: String
var lastName: String
var age: Int
}
但是,我們想要使用JSON作為數據傳輸格式。在此情況下,我們可能需要一個JSON表示法:
{
"first_name": "John",
"last_name": "Doe",
"age": 30
}
如果我們只使用Codable(Encodable和Decodable),那麼這將導致編碼-Swift能夠自動識別要使用的數據格式是JSON,但是由於數據結構中屬性和JSON鍵之間的不同,Decodable(反序列化)會不起作用。
在這種情況下,您可以添加一個名為CodingKeys的嵌套枚舉,該嵌套枚舉遵循CodingKey協議(現在請注意編寫時編寫單詞時的意義),如下所示:
struct Person: Codable {
var firstName: String
var lastName: String
var age: Int
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
case lastName = "last_name"
case age
}
}
現在,我們的Swift編碼器和解碼器將知道我們希望使用「first_name」鍵而不是「firstName」鍵來將數據編碼為JSON,並且通過相同的方式將其解碼回來。
原創文章,作者:FGSOB,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/330843.html