最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift利用Decodable解析JSON的一個(gè)小問(wèn)題詳解

 更新時(shí)間:2018年04月10日 10:31:39   作者:AntScript  
這篇文章主要給大家介紹了關(guān)于Swift利用Decodable解析JSON的一個(gè)小問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

Swift 4是蘋(píng)果計(jì)劃于2017年秋季推出的最新版本,其主要重點(diǎn)是提供與Swift 3代碼的源兼容性,并努力實(shí)現(xiàn)ABI穩(wěn)定性。從Swift4開(kāi)始提供的Decodable解析JSON確實(shí)很方便,但遇到一個(gè)小問(wèn)題,記錄一下。

當(dāng)JSON中某個(gè)key的值為{}或者空字符串”“,而該值需要解析的不是基本類型時(shí),即使標(biāo)記為 Optional,依然會(huì)導(dǎo)致整個(gè)解析失?。?/p>

//: Playground
import Foundation

//Book.swift
struct Book: Codable {
 var id: Int
 var name: String
 var cover: BookCover?

 enum CodingKeys: String, CodingKey {
 case id
 case name
 case cover
 }

 struct BookCover: Codable {

 var url: String
 var thumbURL: String

 enum CodingKeys: String, CodingKey {
 case url
 case thumbURL = "thumb_url"
 }
 }
}

//JSON
let bookJSON1 =
"""
{
 "id": 1,
 "name": "fake name 1",
 "cover": {
 "url": "a.png",
 "thumb_url": "b.png"
 }
}
"""

let bookJSON2 =
"""
{
 "id": 2,
 "name": "fake name 2",
 "cover": {

 }
}
"""

//解析
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let book1 = try? decoder.decode(Book.self, from: bookJSON1.data(using: .utf8)!)

// 解析正常
print(book1)
let book2 = try? decoder.decode(Book.self, from: bookJSON2.data(using: .utf8)!)
// 輸出 nil,cover已經(jīng)是 Optional,為何整個(gè)book都解析失敗?
print(book2)

原因:

因?yàn)閏over是 Optional,所以會(huì)調(diào)用 decodeIfPresent 來(lái)解析,而在cover節(jié)點(diǎn)中沒(méi)有找到url,thumb_url這兩個(gè)key,導(dǎo)致默認(rèn)解析失敗,直接拋出了錯(cuò)誤。

解決:

重新實(shí)現(xiàn) decodeIfPresent,在解析失敗時(shí)返回nil而不是拋出錯(cuò)誤導(dǎo)致整個(gè)解析失?。?/p>

extension KeyedDecodingContainer {
 public func decodeIfPresent<T>(_ type: T.Type, forKey key: K) throws -> T? where T : Decodable {
 return try? decode(type, forKey: key)
 }
}

參考: http://davelyon.net/2017/08/16/jsondecoder-in-the-real-world

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Swift的74個(gè)常用內(nèi)置函數(shù)介紹

    Swift的74個(gè)常用內(nèi)置函數(shù)介紹

    這篇文章主要介紹了Swift的74個(gè)常用內(nèi)置函數(shù)介紹,這篇文章列舉出了所有的Swift庫(kù)函數(shù),內(nèi)置函數(shù)是指無(wú)需引入任何模塊即可以直接使用的函數(shù),需要的朋友可以參考下
    2015-01-01
  • swift中AnyObject和Any的介紹與區(qū)別詳解

    swift中AnyObject和Any的介紹與區(qū)別詳解

    雖然使用swift開(kāi)發(fā)了一段時(shí)間,但是感覺(jué)對(duì)一些基礎(chǔ)的東西了解不是比較透徹,在查詢了許多資料以后還是打算自己動(dòng)手記錄一下,下面這篇文章主要給大家介紹了關(guān)于swift中AnyObject和Any的介紹與區(qū)別的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12
  • Swift實(shí)現(xiàn)快速排序算法的代碼示例

    Swift實(shí)現(xiàn)快速排序算法的代碼示例

    這篇文章主要介紹了Swift實(shí)現(xiàn)快速排序算法的代碼示例,首先利用分治法講解了快速排序的思路,需要的朋友可以參考下
    2016-07-07
  • Swift中定義單例的方法實(shí)例

    Swift中定義單例的方法實(shí)例

    Swift中單例的寫(xiě)法有很多種,下面這篇文章主要給大家介紹了關(guān)于Swift中定義單例的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Swift?列舉內(nèi)存管理與異常處理具體代碼

    Swift?列舉內(nèi)存管理與異常處理具體代碼

    內(nèi)存管理和異常處理在任何編程語(yǔ)言中都是核心概念。盡管有很多教程解釋了Swift自動(dòng)引用計(jì)數(shù)的基本原理,但我發(fā)現(xiàn)沒(méi)有一個(gè)可以從編譯器的角度對(duì)其進(jìn)行解釋。在本文中,我們將通過(guò)詳細(xì)代碼列舉學(xué)習(xí)Swift內(nèi)存管理與異常處理
    2021-11-11
  • SwiftUI智能家居開(kāi)關(guān)燈頁(yè)面搭建示例

    SwiftUI智能家居開(kāi)關(guān)燈頁(yè)面搭建示例

    這篇文章主要為大家介紹了SwiftUI智能家居開(kāi)關(guān)燈頁(yè)面搭建示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • swift中利用runtime交換方法的實(shí)現(xiàn)示例

    swift中利用runtime交換方法的實(shí)現(xiàn)示例

    這篇文章主要給大家介紹了關(guān)于swift中利用runtime交換方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-05-05
  • 純swift實(shí)現(xiàn)ipad版簡(jiǎn)單美團(tuán)界面功能

    純swift實(shí)現(xiàn)ipad版簡(jiǎn)單美團(tuán)界面功能

    這篇文章主要為大家詳細(xì)介紹了純swift實(shí)現(xiàn)ipad版簡(jiǎn)單美團(tuán)界面功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Swift UIButton使用教程

    Swift UIButton使用教程

    這篇文章主要介紹了Swift UIButton的使用方法,幫助大家更好的理解和學(xué)習(xí)swift編程,感興趣的朋友可以了解下
    2020-09-09
  • SwiftUI?引導(dǎo)頁(yè)界面實(shí)現(xiàn)示例

    SwiftUI?引導(dǎo)頁(yè)界面實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了SwiftUI?引導(dǎo)頁(yè)界面實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論

涪陵区| 新野县| 海门市| 卫辉市| 绵阳市| 石城县| 牡丹江市| 津市市| 泰州市| 佛教| 吴旗县| 丽江市| 新蔡县| 六安市| 浮山县| 定安县| 玛曲县| 霍邱县| 淅川县| 嘉峪关市| 金湖县| 崇仁县| 德阳市| 安塞县| 车险| 三明市| 湘潭县| 淅川县| 麻栗坡县| 民勤县| 辽阳县| 来凤县| 瑞昌市| 五大连池市| 贵港市| 郁南县| 黑龙江省| 五原县| 永仁县| 永泰县| 体育|