關于Swift 4.1中的Codable改進詳解
前言
Apple 在 Swift 4.0 中作了很多的改進,其中我個人最喜歡的就是 Codable 協(xié)議的出現(xiàn)。它讓 Swift 自帶了 JSON 、 XML 結構化數(shù)據(jù)和 Model 的映射和轉換能力。
Codable 最常見的使用場景就是:APP 發(fā)起網(wǎng)絡請求,然后我們將服務端響應的 JSON 數(shù)據(jù)轉換為對應的 Model 實體。由于服務端的編程規(guī)范可能與客戶端存在差異, Codable 默認數(shù)據(jù)轉換實現(xiàn)可能不再適用。例如,服務端可能使用的蛇形命名方式而客戶端使用的是駝峰。此時我們就需要在客戶端自己動手實現(xiàn)映射關系。
struct Mac: Codable {
var name: String
var screenSize: Int
var cpuCount: Int
}
let jsonString = """
[
{
"name": "MacBook Pro",
"screen_size": 15,
"cpu_count": 4
},
{
"name": "iMac Pro",
"screen_size": 27,
"cpu_count": 18
}
]
"""
let jsonData = Data(jsonString.utf8)
let decoder = JSONDecoder()
do {
let macs = try decoder.decode([Mac].self, from: jsonData)
print(macs)
} catch {
print(error.localizedDescription)
}
上訴代碼并不能完成理想的解碼操作,因為 Codable 的默認實現(xiàn)無法將蛇形變量名映射到對應的駝峰屬性上。所以在 Swift 4.0 中我們需要對 Mac 進行部分改造:
struct Mac: Codable {
var name: String
var screenSize: Int
var cpuCount: Int
enum CodingKeys : String, CodingKey {
case name
case screenSize = "screen_size"
case cpuCount = "cpu_count"
}
}
好在 Swift 4.1 對此作出了改進?,F(xiàn)在我們可以通過設置 JSONDecoder 的 keyDecodingStrategy 就能實現(xiàn)不同編程規(guī)范之間解碼操作了。與之對應,JSONEncoder 也有一個 keyEncodingStrategy 屬性用于不同編程規(guī)范之間的編碼操作。所以上訴代碼可以簡化為:
struct Mac: Codable {
var name: String
var screenSize: Int
var cpuCount: Int
}
let jsonString = """
[
{
"name": "MacBook Pro",
"screen_size": 15,
"cpu_count": 4
},
{
"name": "iMac Pro",
"screen_size": 27,
"cpu_count": 18
}
]
"""
let jsonData = Data(jsonString.utf8)
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let macs = try decoder.decode([Mac].self, from: jsonData)
print(macs)
} catch {
print(error.localizedDescription)
}
如果你想進行反向轉換操作的話,代碼也非常簡單:
let encoder = JSONEncoder() encoder.keyEncodingStrategy = .convertToSnakeCase let encoded = try encoder.encode(macs)
當然,我們還可以對轉換策略進行自定義實現(xiàn)以其實現(xiàn)一些特定需求。具體的使用方式可以參照代碼
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Swift 中如何使用 Option Pattern 改善可選項的 API 設計
這篇文章主要介紹了Swift 中如何使用 Option Pattern 改善可選項的 API 設計,幫助大家更好的進行ios開發(fā),感興趣的朋友可以了解下2020-10-10
Objective-c代碼如何移植為Swift代碼 Objective-c代碼轉移到Swift過程介紹
這篇文章主要介紹了Objective-c代碼如何移植為Swift代碼,Objective-c代碼轉移到Swift過程介紹,需要的朋友可以參考下2014-07-07
swift實現(xiàn)自定義圓環(huán)進度提示效果
這篇文章主要為大家詳細介紹了swift實現(xiàn)自定義圓環(huán)進度提示效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05

