HandyJSON实现方案浅析
简述
近日,由于Swift升级,导致一段时间HandyJSON无法使用,借这个机会将HandyJSON好好学习了一下~ 然后从另一种方式实现了类似OC的KVC效果的一个小Demo,通过本文记录一些自己的收获,旨在抛砖引玉,有错误的地方还请多多指正 ~ (๑•ᴗ•๑)
好了,下面先从Swift的类型结构开始谈起吧~
MetaDate
Swift在运行时为程序中的每个类型都保留了元数据用于记录(类比OC的元类),包括每个泛型类型的实例.这些数据都是由编译器静态生成,且每种类型都有唯一的元数据记录.元数据在运行时根据需要进行延迟创建~ MetaData的信息 就存储在类别指针的第一个字节中.
Swift将MetaData做以下分类~
现在主要关注 Class和Struct中, 先说Class 从上面文档中的描述 我们可知 所有Apple平台的Swift的类都要与OC的类交互,也就是说 Swift的类别指针就是isa指针.
所以Swift和OCClass 在本质上是一样,只不过Swift剔除其中的动态特性~ 这也是Swift和OC间可以无缝交互的原因之一 ~
上面的内容是Swift Github的文档,大家感兴趣可以看看~ Type MetaData文档接下来 我先分析下HandyJSON的实现方式,然后再说说我自己的实现方式.
HandyJSON
实现思路
HandyJSON的实现的内容大概是这样的:JSON转字典,同时处理自定义映射的内容 --> 获取对象/结构体 属性的内存位置,然后将值写入~ 而其中最核心的内容就是 获取对象/结构体的属性列表与偏移量.
HandyJSON是通过元数据的Nominal Type Descriptor来获取的~ 这是定义的结构体
struct _NominalTypeDescriptor {var mangledName: Int32var numberOfFields: Int32var fieldOffsetVector: Int32var fieldNames: Int32var fieldTypesAccessor: Int32
}
复制代码
这个结构体中就包含了全部需要的内容,只要得到它,接下来就是将内容写入和封装的事了~ 下面就是获取**_NominalTypeDescriptor**的代码,
var nominalTypeDescriptor: NominalTypeDescriptor? {let pointer = UnsafePointer<Int>(self.pointer)let base = pointer.advanced(by: nominalTypeDescriptorOffsetLocation)if base.pointee == 0 {// swift class created dynamically in objc-runtime didn't have valid nominalTypeDescriptorreturn nil}#if swift(>=4.1) || (swift(>=3.3) && !swift(>=4.0))return NominalTypeDescriptor(pointer: relativePointer(base: base, offset: base.pointee - base.hashValue))#elsereturn NominalTypeDescriptor(pointer: relativePointer(base: base, offset: base.pointee))#endif
}
复制代码
这部分内容也是在Swift更新后出问题的地方.在文档中关于这里的部分表示Warning: this is all out of date!,可能作者是通过Swift源码分享确定**_NominalTypeDescriptor**的位置的吧~
我这里就是简单介绍一下,详细的内容 大家还是去看HandyJSON源码吧~ 接下来是我的实现思路
我的实现方式
我写了个Demo 实现的效果大概如下,还有不少瑕疵需要改进,但基本做到KVC的效果了~
Class
对于Class我的思路是这样的,由文档可知,我们能获得isa指针,接下来要做的就是根据OC runtime源码,实现其中需要的类型,然后通过指针进行类型强制转换,这样就得到 我们需要的内容了~
但是 我在实现这块的时候 出现了一些问题 对于ivar结构体时,获取的内容与runtime中的有差异,而且只能获取 属性名称和偏移量(主要这里有些困惑,若有懂的老铁 还请指点一下~)
struct MK_ivar {var mask1:Int32var off:UnsafePointer<CChar>var name:UnsafePointer<CChar>var mask2:UInt32var mask3:UInt32}
复制代码
关于属性类型 我则是通过Mirror来获取的,这样就得到需要的全部信息了.
Struct
Struct则很简单了,在Mirror中获取属性的顺序和结构体中分部的属性是一样的,通Mirror获取属性类型,然后推断出它在结构体中填充的大小,这样各个属性的偏移量就得到了,接下来只要将Value写入就好了~
总结
这是Demo链接,还有一些瑕疵~后续我将其改进,若感觉对你有帮助的话 可以点个Star (๑•ᴗ•๑)
HandyJSON实现方案浅析相关推荐
- 分布式系统唯一ID生成方案浅析
有情怀,有干货,微信搜索[荒古传说]关注这个不一样的程序员. 分布式系统唯一ID生成方案浅析 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.业务ID需要满足的要求如下 全局唯一性:不能出 ...
- 品牌网络推广方案浅析在编写文章标题时都有什么技巧?
在做网站优化的时候,文章是相对于网站比较重要的方面,其中,文章页的标题优化也是有一定技巧的,才能让网站更好地发展,下面品牌网络推广方案就带大家一起来了解一如何给网站一个更好地标题. 1.文章标题取法 ...
- 企业网络推广方案浅析网站优化中外链该怎么发布?
企业网络推广方案表示,利用外链做优化来给网站带来一定的流量和权重是优化人员们经常用到的优化手段,但在实际的操作中,高质量.合理的外链发布并不是一个简单的事情,需要优化人员掌握更多的细节,注意好以免发生 ...
- 品牌网络推广方案浅析网站改版时如何更好地规避降权风险?
网站降权在品牌网络推广方案优化过程中是让优化人员们老生常谈的话题,但也确实让人很"捉急",但在网站优化过程中,难免会让网站有降权的问题,很多的站长也很困恼,那么在优化的过程中,要怎 ...
- 品牌网络推广方案浅析为什么网站关键词排名总是摇摆不定?
网站优化品牌网络推广方案专员每天都在钻研如何让网站关键词排名得到提升,但有时总是结果不尽人意,网站关键词排名总是摇摆不定也让优化人员非常苦恼,下面品牌网络推广方案就带大家一起看一下为什么总是排名不稳定 ...
- mysql分库分表方案浅析
分库分表(这里不讨论中间件) 分库:原因:单机负载高,优点:降低单机负载 分表:原因:单表读写压力大或者数据增长快,优点:使用多个表,提高读写效率 1.(代码)分表,即把一个很大的表达数据分到几个表中 ...
- Java调用Tuxedo方案浅析
Tuxedo为业界公认的性能.稳定性.健壮性都非常好的中间件之一,之所以能做到这么好的稳定性和健壮性,其采用私有的通讯协议是原因之一.因为采用私有的通讯协议,所以客户端与服务端的通讯质量可以全部由Tu ...
- Linux云主机 监控方案浅析
1.为何需要监控 监控是运维工程师的眼睛,它可帮助运维工程师第一时间发现系统的问题. 对于服务器的整个生命周期,都要和监控打交道: 当有服务器上架,都需要加入比如CPU负载.内存.网络.磁盘等基础监控 ...
- Mysql之高可用方案浅析
在工程项目中,系统应用的高可用性越来越重要,业主越来越重视.其实高可用可以分为应用层高可用和数据层高可用,数据层高可用中常见的有关系型数据库mysql的高可用.非关系型NoSQl数据库redis的高可 ...
最新文章
- 使用.net开发手机管理软件 (七) IrMC简介
- 豆瓣9.3分,日漫风格的机器学习数学书
- OpenResty+lua+GraphicsMagick生成缩略图
- ruby array_Ruby中带有示例的Array.zip()方法
- 2021 最新CV综述分类汇总(持续更新)
- git修改文件名大小写的方法。
- GB28181-2016系统相关技术介绍
- caffe的python接口学习(5):生成deploy文件
- 腾达W308r改64M内存8M闪存CPU加散热片,刷磊科NR235W/NR236W的软件
- 网页调用OCX控件总结
- macos sierra_如何在macOS Sierra中恢复“剩余电池时间”
- 隐马尔可夫模型(Hidden Markov Model)
- 斯坦福AI百年报告2017:人工智能与机器学习全景式概览
- 网吧计算机配置特点,揭秘:网吧电脑配置很低,却怎么用也不卡顿,这是为什么呢?...
- 手把手教你搭建自己的 AV1 Analyzer
- 用户运营指标体系建设实践 by 千冰仪
- Active X控件在IE上自动下载并注册
- wildfly(JBOSS)启动报错
- 2007中国IT产业10大丑闻
- Windows找不到文件‘xxxxx‘。请确定文件名称是否正确,再试一次。 win+r命令打不开xxxx
热门文章
- matlab 图像去白边,Matlab生成的图片如何去掉白边?
- 芯片破壁者(四):兵戈未息的DRAM战场
- JAVA里面的 B-super-A是什么意思?
- CODESYS 赛搏机器智能MIC7001总线控制器+松下A6BE总线驱动器
- 计算机多媒体对语文教学的提高,谈谈多媒体在语文教学中的运用(教师中心稿)...
- yoyo跑_yoyo主持人5岁女儿照片曝光 其老公魏哲浩个人资料简介
- shell 经典教程[大神之路]
- 实战第一步:市场调研
- 用Python 写个 开心消消乐小游戏
- matlab 光栅 傅里叶,光栅原理及MATLAB仿真汇编.doc