功能:model = modelType.transform(rawdata)

使用分析:

使用机制:继承+实现配置+使用;

需要自己实现什么?

设计分析:

工具模块?机制模块?model基类?

生成机制?

如何组织?

接口:通过继承使用接口;

主干类:

JSONDeserializer<T: HandyJSON>

HandyJSON: _ExtendCustomModelType: _Transformable: _Measurable

_ExtendCustomModelType

mutating func mapping(mapper: HelpingMapper)

mutating func didFinishMapping()

_Transformable

transform(from object: Any) -> Self?

_Measurable

headPointerOfStruct() -> UnsafeMutablePointer<Byte>

问题分解:

1、遍历rawdata对model赋值;

2、赋值解决方案,前提条件:无法获取成员变量的内存引用;

解决方案:kvc赋值(不支持)、根据内存对齐规则直接对内存赋值;

3、对象内存模型信息提取;

4、复杂赋值要处理的情况:

(1)rawdata引用与目标变量名称不一致;

(2)rawdata引用与目标变量路径不一致;

(3)rawdata引用与目标变量类型不一致;

static func _transform(dict: [String: Any], to instance: inout Self) {

guard let properties = getProperties(forType: Self.self) else {

InternalLogger.logDebug("Failed when try to get properties from type: \(type(of: Self.self))")

return

}

// do user-specified mapping first

let mapper = HelpingMapper()

instance.mapping(mapper: mapper)

// get head addr

let rawPointer = instance.headPointer()

InternalLogger.logVerbose("instance start at: ", Int(bitPattern: rawPointer))

// process dictionary

let _dict = convertKeyIfNeeded(dict: dict)

let instanceIsNsObject = instance.isNSObjectType()

let bridgedPropertyList = instance.getBridgedPropertyList()

for property in properties {

let isBridgedProperty = instanceIsNsObject && bridgedPropertyList.contains(property.key)

let propAddr = rawPointer.advanced(by: property.offset)

InternalLogger.logVerbose(property.key, "address at: ", Int(bitPattern: propAddr))

if mapper.propertyExcluded(key: Int(bitPattern: propAddr)) {

InternalLogger.logDebug("Exclude property: \(property.key)")

continue

}

let propertyDetail = PropertyInfo(key: property.key, type: property.type, address: propAddr, bridged: isBridgedProperty)

InternalLogger.logVerbose("field: ", property.key, "  offset: ", property.offset, "  isBridgeProperty: ", isBridgedProperty)

if let rawValue = getRawValueFrom(dict: _dict, property: propertyDetail, mapper: mapper) {

if let convertedValue = convertValue(rawValue: rawValue, property: propertyDetail, mapper: mapper) {

assignProperty(convertedValue: convertedValue, instance: instance, property: propertyDetail)

continue

}

}

InternalLogger.logDebug("Property: \(property.key) hasn't been written in")

}

}

HandyJSON代码阅读的更多相关文章

  1. 代码阅读分析工具Understand 2.0试用

    Understand 2.0是一款源代码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实可以大大提高代码阅读效率.由于Understand功能十分强大,本文不可能详尽地介绍它的所有功能,所 ...

  2. Android 上的代码阅读器 CoderBrowserHD 修改支持 go 语言代码

    我在Android上的代码阅读器用的是 https://github.com/zerob13/CoderBrowserHD 改造的版本,改造后的版本我放在 https://github.com/ghj ...

  3. Linux协议栈代码阅读笔记(二)网络接口的配置

    Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...

  4. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  5. 图形化代码阅读工具——Scitools Understand

    Scitools出品的Understand 2.0.用了很多年了,比Source Insight强大很多.以前的名字叫Understand for C/C++,Understand for Java, ...

  6. Python - 关于代码阅读的一些建议

    初始能力 让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法.技巧和业务流程等频繁地阻碍和打断. 建议基本满足以下条件,再开始进行代码阅读: 具备一定的语言基础:熟悉基础语法,常用的函数 ...

  7. MediaInfo代码阅读

      MediaInfo是一个用来分析媒体文件的开源工具. 支持的文件非常全面,基本上支持所有的媒体文件. 最近是在做HEVC开发,所以比较关注MediaInfo中关于HEVC的分析与处理. 从Meid ...

  8. Tools - 一些代码阅读的方法

    1 初始能力 让阅读思路清晰连贯,保持在程序的流程架构和逻辑实现上,不被语法.编程技巧和业务流程等频繁地阻碍和打断. 语言基础:熟悉基础语法,常用的函数.库.编程技巧等: 了解设计模式.构建工具.代码 ...

  9. Bleve代码阅读(二)——Index Mapping

    引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...

随机推荐

  1. <<数学传奇>>概述

    简介 在网易公开课上看完了蔡天新教授的<<数学传奇>>,课程共10集.分别讲述了古希腊的毕达哥拉斯.波斯(伊朗)的 花拉子密和欧玛尔.海亚姆.中国的秦九韶.英国的牛顿.法国的笛 ...

  2. img图片加载失败默认图片

    <img :src="item.goods_pic" onerror="javascript:this.src='../static/images/default. ...

  3. java利用直方图实现图片对比

    需求 实现两张图对比,找出其中不同的部分. 分析 首先将大图切片,分成许多小图片.然后进行逐个对比,并设定相似度阈值,判断是否是相同.最后整理,根据生成数组标记不同部分.如果切片足够小,便越能精确找出 ...

  4. String API

    String它即是内置对象,也是 包装类型之一,所有的String API都无法修改原字符串,而是返回一个新的字符串.   1.大小写转换 str.toUpperCase(); str = str.t ...

  5. UX2内核浏览加速技术纲要[带你解决WebView卡顿]

    UX2内核是本人负责主要开发的浏览服务项目,其主要目的是为开发者提供一个简单好用.轻便的网络浏览服务.UX2内核的安卓端是基于WebView进行深度优化的,同时欢迎大家使用这个内核用于app页面或浏览 ...

  6. html+css模仿的锤子官方首页

    <div id="wrapper"> <header> <div class="container"> <h1> ...

  7. mongoDB BI 分析利器 - PostgreSQL FDW (MongoDB Connector for BI)

    背景 mongoDB是近几年迅速崛起的一种文档型数据库,广泛应用于对事务无要求,但是要求较好的开发灵活性,扩展弹性的领域,. 随着企业对数据挖掘需求的增加,用户可能会对存储在mongo中的数据有挖掘需 ...

  8. 在IDEA中设置方法自动注释(带参数和返回值)

    第一部分 设置 打开设置面板 新建 在线模板 新建自动添加规则,注意 这里触发的字符 不能随便写 必须为 * Template text 区域 看上去有点乱,但是是为了显示时的对齐,该区域的内容如下( ...

  9. SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)

    因为篇幅原因,AlwaysOn可用性组被拆成了两部分:理论部分和实战部分.而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建. 三篇文章各自的链接: SQL Server ->> ...

  10. Linux ->> scp命令复制对端机器上的文件/文件夹

    scp是secure copy的简写,用于在Linux下从远程机器拷贝文件. 特点: 传输是加密的,稍微影响了一下速度.而相比较rsync,它对于资源的占用还是有优势的. 用法 scp [参数] [原 ...