日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SwiftyJson 的初步理解

發(fā)布時(shí)間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SwiftyJson 的初步理解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

SwiftyJson 的初步理解

  • 最初的認(rèn)識(shí) SwiftyJson 的本質(zhì)就是一個(gè) Public Struct JSON結(jié)構(gòu)體

  • Struct JSON 的構(gòu)成

  • public Struct JSon {fileprivate var rawArray: [Any] = []fileprivate var rawDictionary: [String: Any] = [:]fileprivate var rawString: String = ""fileprivate var rawNumber: NSNumber = 0fileprivate var rawNull: NSNull = NSNull()fileprivate var rawBool: Bool = false/// JSON type, fileprivate setterpublic fileprivate(set) var type: Type = .null/// Error in JSON, fileprivate setterpublic fileprivate(set) var error: SwiftyJSONError?public static var nullJSON: JSON { return null }public static var null: JSON { return JSON(NSNull()) }/// Object in JSON 這個(gè)是核心的屬性 所有的操作就是 在這給個(gè)地方開(kāi)始的public var object: Any {get {switch self.type {case .array:return self.rawArraycase .dictionary:return self.rawDictionarycase .string:return self.rawStringcase .number:return self.rawNumbercase .bool:return self.rawBooldefault:return self.rawNull}}set {error = nilswitch unwrap(newValue) {case let number as NSNumber:if number.isBool {type = .boolself.rawBool = number.boolValue} else {type = .numberself.rawNumber = number}case let string as String:type = .stringself.rawString = stringcase _ as NSNull:type = .nullcase nil:type = .nullcase let array as [Any]:type = .arrayself.rawArray = arraycase let dictionary as [String: Any]:type = .dictionaryself.rawDictionary = dictionarydefault:type = .unknownerror = SwiftyJSONError.unsupportedType}}}

    3 - Set 我的初步認(rèn)識(shí) 沒(méi)有對(duì)其他的重載方法分析 只對(duì)整體的做個(gè)大致的介紹 初始化方法的時(shí)候 設(shè)置object 屬性的值 在開(kāi)始初始化的時(shí)候 最先開(kāi)始的是 初始化懶加載的屬性 然后再對(duì) object 屬性 做set 賦值 賦值的時(shí)候。實(shí)現(xiàn)了unwrap(newValue)這個(gè)遞歸的方法 推導(dǎo)出json的所有基礎(chǔ)類型 并且返回的是JSon初始化后的結(jié)構(gòu)體 大概是這樣的 我最喜歡的就是unwrap(newValue) 遞歸的設(shè)置思路 很佩服作者

    JSON{JSON{JSoN } }

    一個(gè)一個(gè)的JSON結(jié)構(gòu)體組成

    4 Get值的時(shí)候 對(duì)下標(biāo)進(jìn)行了重載 可傳遞多個(gè)參數(shù)的 和 傳遞數(shù)組【】

    可傳遞多個(gè)參數(shù)的重載 public subscript(path: JSONSubscriptType...) -> JSON {get {return self[path]}set {self[path] = newValue}} 傳遞數(shù)組的重載 public subscript(path: [JSONSubscriptType]) -> JSON {get {return path.reduce(self) { $0[sub: $1] }}set {switch path.count {case 0:returncase 1:self[sub:path[0]].object = newValue.objectdefault:var aPath = pathaPath.remove(at: 0)var nextJSON = self[sub: path[0]]nextJSON[aPath] = newValueself[sub: path[0]] = nextJSON}}} 傳遞 一個(gè)參數(shù)的重載 這個(gè)參數(shù)是 需要實(shí)現(xiàn) JSONSubscriptType 本上我們都只是會(huì)用到 string 和 Int 作者已經(jīng)幫我們把對(duì) String 和 Int 做了擴(kuò)展 public enum JSONKey {case index(Int)case key(String)}public protocol JSONSubscriptType {var jsonKey: JSONKey { get }}extension Int: JSONSubscriptType {public var jsonKey: JSONKey {return JSONKey.index(self)}}extension String: JSONSubscriptType {public var jsonKey: JSONKey {return JSONKey.key(self)}} // 傳遞 一個(gè)參數(shù)的重載 fileprivate subscript(sub sub: JSONSubscriptType) -> JSON {get {switch sub.jsonKey {case .index(let index): return self[index: index]case .key(let key): return self[key: key]}}set {switch sub.jsonKey {case .index(let index): self[index: index] = newValuecase .key(let key): self[key: key] = newValue}}}
  • 還需了解的一個(gè)是 reduce高階函數(shù) 如果你用過(guò) map,filter,等 那么對(duì)reduce的理解也不是難 只需要理解的是 在執(zhí)行的時(shí)候 每次返回的都是一個(gè)JSON的結(jié)構(gòu)體 那么你就知道了為什么可以無(wú)限的使用下標(biāo)獲取到最后的值了
  • 總結(jié)

    以上是生活随笔為你收集整理的SwiftyJson 的初步理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。